home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / cxl400.arc / CXL.DOC next >
Text File  |  1988-11-19  |  169KB  |  4,501 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.                                     C X L
  23.  
  24.                  The C Programmer's Extended Function Library
  25.  
  26.                                  Version 4.0
  27.  
  28.                                 July 27, 1988
  29.  
  30.                                by Mike Smedley
  31.  
  32.                 Copyright (c) 1987, 1988  All Rights Reserved
  33.  
  34.                                Reference Manual
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.                                       1    
  61.  
  62.  
  63.                               TABLE OF CONTENTS
  64.  
  65.                                                             Page
  66.  
  67.                 Introduction..................................6
  68.                     Features of the Library...................6
  69.                     Registration Information..................7
  70.                     How to Contact the Author.................7
  71.                     Disclaimer................................8
  72.                     Trademarks................................8
  73.                 Tutorial......................................9
  74.                     Windowing Functions (General).............9
  75.                     Formatted Keyboard Input Functions.......10
  76.                     Multi-Field Formatted Input Functions....13
  77.                     Bar-Selection Menu Functions.............16
  78.                     String Selection Functions...............20
  79.                     Expanded Memory (EMS) Functions..........21
  80.                     Mouse Functions..........................23
  81.                 Global Variables.............................24
  82.                     _cgasnow.................................24
  83.                     _kbloop..................................24
  84.                     _mouse...................................24
  85.                     _onkey...................................24
  86.                     _videoseg................................24
  87.                     _werrno..................................24
  88.                     _wesc....................................24
  89.                     _whandle.................................24
  90.                     _winp....................................24
  91.                     _wmenu...................................25
  92.                     _wrec....................................25
  93.                     _wsel....................................25
  94.                     _wtotal..................................25
  95.                 Library Functions............................26
  96.                     attrib...................................26
  97.                     beep.....................................26
  98.                     biosver..................................26
  99.                     box_.....................................26
  100.                     boxd.....................................27
  101.                     capsoff..................................27
  102.                     capson...................................27
  103.                     clearkeys................................27
  104.                     clockcal.................................27
  105.                     clreol_..................................28
  106.                     clrscrn..................................28
  107.                     clrwin...................................28
  108.                     cvaltype.................................28
  109.                     delay_...................................29
  110.                     disktoscrn...............................29
  111.                     disktowin................................29
  112.                     emsalloc.................................29
  113.                     emsdealloc...............................30
  114.                     emsexist.................................30
  115.                     emsframe.................................30
  116.                     emsfree..................................30
  117.                     emsmap...................................31
  118.  
  119.  
  120.                                       2    
  121.                     emsread..................................31
  122.                     emstotal.................................31
  123.                     emsver...................................31
  124.                     emswrite.................................32
  125.                     expmem...................................32
  126.                     extmem...................................32
  127.                     fill_....................................32
  128.                     filld....................................33
  129.                     gameport.................................33
  130.                     getchf...................................33
  131.                     getns....................................34
  132.                     getxch...................................34
  133.                     gotoxy_..................................34
  134.                     inputsf..................................34
  135.                     kbstat...................................35
  136.                     lcrlf....................................35
  137.                     lprintc..................................35
  138.                     lprintf..................................36
  139.                     lprintns.................................36
  140.                     lprints..................................36
  141.                     lprintsb.................................36
  142.                     lprintsu.................................36
  143.                     machid...................................37
  144.                     mathchip.................................37
  145.                     mode.....................................37
  146.                     msbpress.................................37
  147.                     msbreles.................................38
  148.                     mscursor.................................38
  149.                     msgotoxy.................................38
  150.                     mshbounds................................39
  151.                     mshidecur................................39
  152.                     msinit...................................39
  153.                     msmotion.................................39
  154.                     msshowcur................................40
  155.                     msspeed..................................40
  156.                     msstatus.................................40
  157.                     msvbounds................................40
  158.                     numflop..................................40
  159.                     numoff...................................41
  160.                     numon....................................41
  161.                     numpar...................................41
  162.                     numser...................................41
  163.                     printc...................................41
  164.                     printcd..................................42
  165.                     prints...................................42
  166.                     printsd..................................42
  167.                     readchat.................................43
  168.                     readcur..................................43
  169.                     revattr..................................43
  170.                     scrndump.................................43
  171.                     scrntodisk...............................43
  172.                     setattr..................................44
  173.                     setcursz.................................44
  174.                     setkbloop................................44
  175.                     setlines.................................44
  176.                     setonkey.................................45
  177.                     sound_...................................45
  178.  
  179.  
  180.                                       3    
  181.                     spc......................................46
  182.                     srestore.................................46
  183.                     ssave....................................46
  184.                     strblank.................................46
  185.                     strbmatch................................46
  186.                     strchg...................................47
  187.                     strcode..................................47
  188.                     strdel...................................47
  189.                     strichg..................................48
  190.                     stridel..................................48
  191.                     striinc..................................48
  192.                     strinc...................................49
  193.                     strins...................................49
  194.                     striocc..................................49
  195.                     strleft..................................50
  196.                     strltrim.................................50
  197.                     strmatch.................................50
  198.                     strmid...................................50
  199.                     strocc...................................51
  200.                     strright.................................51
  201.                     strrol...................................51
  202.                     strror...................................52
  203.                     strsetsz.................................52
  204.                     strshl...................................52
  205.                     strshr...................................52
  206.                     strtrim..................................53
  207.                     struplow.................................53
  208.                     sysdate..................................53
  209.                     systime..................................54
  210.                     tabstop..................................54
  211.                     timer....................................54
  212.                     touplow..................................54
  213.                     videoinit................................55
  214.                     vidtype..................................55
  215.                     wactiv...................................55
  216.                     waitkey..................................56
  217.                     waitkeyt.................................56
  218.                     waitvret.................................56
  219.                     wblocked.................................56
  220.                     wborder..................................57
  221.                     wbox.....................................57
  222.                     wcclear..................................57
  223.                     wcenters.................................57
  224.                     wchgattr.................................58
  225.                     wclear...................................58
  226.                     wclose...................................58
  227.                     wcloseall................................58
  228.                     wclreol..................................59
  229.                     wclreos..................................59
  230.                     wcopy....................................59
  231.                     wdelline.................................59
  232.                     wdupc....................................60
  233.                     werrmsg..................................60
  234.                     wfill....................................60
  235.                     wfindrec.................................60
  236.                     wgetc....................................61
  237.                     wgetchf..................................61
  238.  
  239.  
  240.                                       4    
  241.                     wgetns...................................62
  242.                     wgets....................................62
  243.                     wgotoxy..................................62
  244.                     whandle..................................63
  245.                     whide....................................63
  246.                     whline...................................63
  247.                     winpdef..................................63
  248.                     winpread.................................64
  249.                     winputsf.................................64
  250.                     winsline.................................65
  251.                     wintodisk................................65
  252.                     wisactiv.................................65
  253.                     wmenudef.................................66
  254.                     wmenuget.................................66
  255.                     wmessage.................................67
  256.                     wmove....................................67
  257.                     wopen....................................68
  258.                     wperror..................................68
  259.                     wpgotoxy.................................68
  260.                     wprintc..................................69
  261.                     wprintf..................................69
  262.                     wprints..................................69
  263.                     wputc....................................70
  264.                     wputns...................................70
  265.                     wputs....................................70
  266.                     wrestore.................................70
  267.                     wrjusts..................................71
  268.                     wsave....................................71
  269.                     wsbounds.................................71
  270.                     wscanf...................................72
  271.                     wscroll..................................72
  272.                     wsetesc..................................72
  273.                     wsize....................................72
  274.                     wsseldef.................................73
  275.                     wsselget.................................73
  276.                     wtextattr................................73
  277.                     wtitle...................................74
  278.                     wunhide..................................74
  279.                     wvline...................................74
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.                                       5    
  301.  
  302.  
  303.                                  INTRODUCTION
  304.  
  305.     The CXL library is intended to be a supplement to your compiler's
  306.     run-time library.  It contains over 170 multi-purpose functions.  The
  307.     main feature is the windowing system.  There are many supporting
  308.     features as well.  The library is available for several of today's
  309.     popular C compilers.  These routines were written in highly-optimized C
  310.     code ensuring maximum program speed and minimum program size.  This
  311.     release is an evaluation release containing everything you need to write
  312.     C programs using the small memory model.  The libraries for the other
  313.     memory models are supplied when you register.
  314.  
  315.  
  316.     Features of the CXL Library.
  317.      
  318.         -   Multi-layered, overlapping windowing system
  319.         -   Pop-up menus
  320.         -   Pull-down menus
  321.         -   Lotus-style menus
  322.         -   Multi-field keyboard data entry
  323.         -   Formatted keyboard input
  324.         -   EGA 43-line and VGA 50-line modes
  325.         -   DESQview compatibility
  326.         -   Microsoft compatible mouse functions
  327.         -   Lotus/Intel/Microsoft EMS memory functions
  328.         -   Screen/window swapping to memory or disk
  329.         -   Direct screen writing for fast screen writes
  330.         -   Advanced string manipulation
  331.         -   Keyboard event trapping
  332.         -   Simple context sensitive help
  333.         -   Pattern matching
  334.         -   Data encryption
  335.         -   Date and time functions
  336.         -   Equipment detection
  337.         -   Printing functions
  338.         -   Sound functions
  339.         -   and more!
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.  
  359.  
  360.                                       6    
  361.  
  362.  
  363.     Registration Information.
  364.      
  365.     You are free to copy and distribute this library freely, however, if you
  366.     find this library of use to you, you are encouraged to register your
  367.     copy.  The registration cost is only $25!  Included in the registration
  368.     cost is:
  369.                                           
  370.         - two 5.25-inch diskettes containing:
  371.             - the complete library source code!  (100% native C code).
  372.             - libraries for the remaining memory models.
  373.         - royalty-free use of library functions.
  374.         - technical support.
  375.         - low-cost upgrades to future revisions.
  376.         - shipping and handling.
  377.  
  378.     To register, print the registration form, REGISTER.DOC, by typing the
  379.     command "copy register.doc prn" from the DOS prompt and fill in the
  380.     requested information.  Or you can use any piece of paper and include on
  381.     it your name, address, phone number, CompuServe/GEnie mail address, CXL
  382.     version, your compiler and its version, where you received CXL from, and
  383.     any comments.  Non-U.S. orders add $5 for air mail.  Send payment along
  384.     with registration information to:
  385.  
  386.             Mike Smedley
  387.             P.O. Box 33603
  388.             San Antonio, TX 78265
  389.  
  390.  
  391.     How to Contact the Author.
  392.  
  393.     U.S. Mail       -   see address above
  394.     Telephone       -   (512) 590-2910  (after 5 PM & weekends, not collect)
  395.     BIX             -   msmedley
  396.     CompuServe      -   71331,2244
  397.     GEnie           -   M.SMEDLEY
  398.     Abbey Road BBS  -   (512) 590-6036  1200/2400/9600 8-N-1
  399.     Telstar BBS     -   (512) 822-8882  1200/2400 8-N-1
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.                                       7    
  421.  
  422.      
  423.     Disclaimer.
  424.      
  425.     The author claims no responsibility for any damages caused by the use or
  426.     misuse of this library.  This product is distributed "as is" with no
  427.     warranty expressed or implied.  The author will not be responsible for
  428.     any losses incurred by the use of this product.  The author reserves the
  429.     right to make modifications at any time.  Prices are subject to change
  430.     without notice.
  431.      
  432.  
  433.     Trademarks.
  434.      
  435.     BIX is a trademark of McGraw-Hill Inc.
  436.     CompuServe is a registered trademark of CompuServe Incorporated.
  437.     DESQview is a trademark of Quarterdeck Office Systems.
  438.     Epson is a registered trademark of Seiko Epson Corporation.
  439.     GEnie is a trademark of GE Information Services.
  440.     IBM is a registered trademark of International Business Machines.
  441.     LIM and EMS are trademarks of Lotus, Intel, and Microsoft Corps.
  442.     Lotus is a registered trademark of Lotus Development Corporation.
  443.     Microsoft is a registered trademark of Microsoft Corporation.
  444.     Turbo C is a registered trademark of Borland International.
  445.     Zortech is a trademark of Zortech Limited.
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.                                       8    
  481.  
  482.  
  483.                                    TUTORIAL
  484.  
  485.  
  486.     Windowing Functions (General).
  487.      
  488.     CXL has a a powerful windowing system that can be very useful in an
  489.     application program.  All windowing functions are prefixed with a 'w'.
  490.     The windowing is controlled by CXL's window manager which is called by
  491.     every windowing function.  The window manager keeps track of which
  492.     window is active; each window's position, cursor location, attributes,
  493.     etc.; how many windows are open; and other information.
  494.  
  495.     All windowing functions set the _werrno global variable before
  496.     returning.  The literal value of this variable can be viewed by calling
  497.     the werrmsg() function. This feature is useful for debugging programs
  498.     that use the windowing functions.
  499.      
  500.     Windows can have a border or be borderless.  Borderless windows have a
  501.     greater effective region of which to work with.  Window borders can be a
  502.     variety of styles.  
  503.  
  504.     Windows may also have titles.  If the window has a border, the title
  505.     will be displayed on the top border.  The window title can also be
  506.     used to name a window allowing easier identification.
  507.  
  508.     You may open as many windows as memory permits.  Once a window is
  509.     opened, it immediately becomes the active window.  CXL's windowing
  510.     functions can only be performed on the active window.  If you want to
  511.     perform a function on a inactive window, you must activate it first. 
  512.      
  513.     Once you have a window opened, you may perform a variety of tasks in it
  514.     including displaying output, accepting input, resizing, changing colors,
  515.     moving, changing border style, and more.  See the supplied CXLDEMO.C
  516.     program for a complete example of how to use the windowing system.
  517.  
  518.     Example:
  519.      
  520.         WINDOW w1,w2;                   /*  window handles       */
  521.                                         /*  open 1st window      */
  522.         w1=wopen(0,0,10,40,0,LCYAN|_BLUE,LCYAN|_BLUE);
  523.         if(!w1) error_routine();        /*  check for error      */
  524.         wputs("Hello, ");               /*  display string       */
  525.                                         /*  open 2nd window      */
  526.         w2=wopen(7,20,18,60,2,LRED|_MAGENTA,LRED|_MAGENTA);
  527.         if(!w2) error_routine();        /*  check for error      */
  528.         wputs("Hello, ");               /*  display string       */
  529.         wactiv(w1);                     /*  activate 1st window  */
  530.         wputs("there");                 /*  display string       */
  531.         wactiv(w2);                     /*  activate 2nd window  */
  532.         wputs("there");                 /*  display string       */
  533.         wclose();                       /*  close 2nd window     */
  534.         wclose();                       /*  close 1st window     */
  535.  
  536.  
  537.  
  538.  
  539.  
  540.                                       9    
  541.  
  542.  
  543.     Formatted Keyboard Input Functions.
  544.  
  545.     The inputsf() and winputsf() functions in CXL accept keyboard input
  546.     through the use of CXL's own input format strings.  These format strings
  547.     are not the same as what scanf() uses.  They have the ability to
  548.     restrict and convert input for each character received from the
  549.     keyboard.  They also allow for custom prompts between each character
  550.     input.  The format control characters can be in any order in the string,
  551.     but all letters must be in the case shown here.  Invalid control
  552.     characters will cause the function to return an error and the receiving
  553.     string will be empty.  Spaces can be used to improve readability of the
  554.     format string.  If the Escape key is not disabled, when pressed it will
  555.     return an error code and the receiving string will be empty.  Valid
  556.     format control characters are:
  557.      
  558.         !.......!   - start and end exclamation points, any letters between
  559.                       them are format command toggles.  The valid format
  560.                       command toggles are:
  561.      
  562.                         -   - decreases text attribute, works with
  563.                               winputsf() only
  564.      
  565.                         +   - increases text attribute, works with
  566.                               winputsf() only
  567.      
  568.                         C   - toggles copying of display (quoted) characters
  569.                               to the receiving string. (default is off)
  570.      
  571.                         E   - toggles Escape key checking off/on. When off,
  572.                               if the Escape key is pressed, the function
  573.                               returns an error code and the string will be
  574.                               null.   The default for inputsf() is on.  For
  575.                               winputsf(), the default is the value of the
  576.                               global variable _wesc upon calling.
  577.      
  578.                         L   - toggles lower-case conversion.  When on, the
  579.                               case of input letters will be forced to lower
  580.                               case. (default is off)
  581.      
  582.                         M   - toggles mixed-case conversion.  When on, the
  583.                               case of input letters will be forced to
  584.                               upper-case for the first letter of each word
  585.                               and lower-case for the remaining letters.
  586.                               (default is off)
  587.      
  588.                         P   - toggles password mode.  When on, input
  589.                               characters will be echoed to the screen as
  590.                               spaces. (default is off)
  591.  
  592.                         R   - toggles return key checking.  When off, the
  593.                               carriage return key will be ignored until the
  594.                               end of the format string. (default is on)
  595.      
  596.                         U   - toggles upper-case conversion.  When on, the
  597.                               case of input letters will be forced to
  598.  
  599.  
  600.                                       10   
  601.                               upper-case. (default is off)
  602.      
  603.      
  604.         '.......'   - start and end quotes, any characters between them will
  605.           .OR.        be displayed as text.  If the 'C' command toggle is
  606.         \".....\"     on, the characters will also be copied to the
  607.                       receiving string.
  608.  
  609.         #   - accept numeric character '0' thru '9'.
  610.         9   - accept numeric character '0' thru '9', '.', '-', and '+'.
  611.         ?   - accept any character.
  612.         *   - accept any printable character.
  613.         A   - accept alpha character 'A' thru 'Z', 'a' thru 'z', and
  614.               space.
  615.         D   - accept character associated with a numeric date '0' thru
  616.               '9', '-', and '/'.
  617.         L   - accept alpha character 'A' thru 'Z', 'a' thru 'z', and
  618.               space.  Input characters will be converted to lower case.
  619.         M   - accept alpha character 'A' thru 'Z', 'a' thru 'z', and
  620.               space input character will be converted to mixed case.
  621.         P   - accept alphanumeric password character 'A' thru 'Z',
  622.               'a' thru 'z', '0' thru '9', and space.
  623.         T   - accept character associated with a telephone number
  624.               '0' thru '9', '(', ')', '-', and space.
  625.         U   - accept alpha character 'A' thru 'Z', 'a' thru 'z', and
  626.               space input character will be converted to upper case.
  627.         X   - accept alphanumeric character 'A' thru 'Z', 'a' thru 'z',
  628.               '0' thru '9', and space.
  629.         Y   - accept a yes/no character 'Y', 'y', 'N', and 'n'.
  630.  
  631.      
  632.     <.......>   - set inclusion.  Accept a character from valid list of
  633.                   characters between angle brackets.
  634.      
  635.     [.......]   - set exclusion.  Accept a character which cannot be
  636.                   present in between the square brackets.
  637.      
  638.     Examples:
  639.      
  640.     inputsf(str,"'Enter name:  ' !UR! XXXXX !R! XXXXXXXXXX");
  641.      
  642.     Prompts for name, inputs string from keyboard converting characters to
  643.     upper case as it goes, allows up to 15 alphanumeric characters as input.
  644.     The return key is disabled until at least 5 characters have been
  645.     entered.  Characters will be copied to str.  This space must already be
  646.     allocated!
  647.  
  648.      
  649.     inputsf(str,"!R! 'Enter phone:  '!C! '(' ### ') ' ### '-' ####");
  650.      
  651.     Prompts for a full phone number including area code, allows only digit
  652.     characters and displays format punctuation as it goes.  The entire field
  653.     must be filled before return can be pressed.  All of the characters
  654.     except the prompt will be copied to the receiving string.  The input
  655.     string will be copied to str, which must have already been allocated.
  656.      
  657.      
  658.  
  659.  
  660.                                       11   
  661.     inputsf(str,"!R!'Enter SSAN:  '<0123456>##'-'##'-'####");
  662.      
  663.     Prompts for a Social Security number.  Will not allow return to be
  664.     pressed until all digits have been entered.  The first digit of the SSAN
  665.     must be 0 - 6. Dashes will be displayed as you are typing in the data,
  666.     but will not be contained in the receiving string str.
  667.      
  668.      
  669.     inputsf(str,"!R!'Enter DOB (MM/DD/YY):  '<01>#'/'<0123>#'/'##");
  670.      
  671.     Prompts for Date of Birth.  Allows only valid digits for the input date.
  672.     Prevents the return key from working until all digits have been typed
  673.     in.
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.                                       12   
  721.  
  722.  
  723.     Multi-Field Formatted Input Functions.
  724.      
  725.     Two functions are needed to process multi-field keyboard input from
  726.     windows:  winpdef(), and winpread().  The winpdef() function defines
  727.     your input field and is called for each input field to be defined. The
  728.     winpread() function processes all defined fields.  The formatted input
  729.     capabilities are much like those of the inputsf() and winputsf()
  730.     functions.  The major difference is that with the winpdef()/winpread()
  731.     combination, you can edit back and forth between fields before finally
  732.     accepting the input.
  733.  
  734.     For every input field you want to define, you must call winpdef(). This
  735.     will allocate memory to hold the input record information. The first two
  736.     parameters, wrow and wcol, specify where in the active window the field
  737.     will be loaded.  The next parameter, str, is the address of the string
  738.     buffer to receive the input data.
  739.  
  740.     The next parameter, format, is the input field format string. It
  741.     controls how each character is input and how large the input field will
  742.     be.  It consists of 1 or more format characters, and may have displayed
  743.     text in between any of the format control characters.  You may use
  744.     spaces in between the format control characters for readability.  Valid
  745.     format control characters are listed in the "Formatted Keyboard Input
  746.     Functions" section.  The case of the format control characters must be
  747.     as shown.  Format strings for winpdef() are just like those of inputsf()
  748.     and winputsf() except there are no command toggles. If you make a syntax
  749.     error in the format string, winpdef() will return W_INVFORMT to notify
  750.     you of the mistake.
  751.  
  752.     The next parameter in the winpdef() function is fconv.  These are
  753.     similar to the command toggles of inputsf() and winputsf() except that
  754.     the fconv character applies conversion to the whole field.  Valid fconv
  755.     characters are:
  756.  
  757.             0   - apply no conversion
  758.             'L' - convert letters to lower case
  759.             'M' - convert letters to mixed upper & lower case
  760.             'P' - password field (do not echo characters)
  761.             'U' - convert letters to upper case
  762.  
  763.     The next parameter in the winpdef() function is fattr.  This is the text
  764.     attribute of the screen field.  After the fattr parameter comes the
  765.     update parameter.  This parameter allows you to specify if the input
  766.     field is going to create new data or update old data.  If the update
  767.     parameter is 0, then the input field will be used for entering new data.
  768.     If the update parameter is non-zero, then the input field will be used
  769.     to update the old data contained in the str parameter.  If you do choose
  770.     to update, then the length of the str string must be the same as the
  771.     length of the input field defined in the format string.  If the two
  772.     lengths don't match, then winpdef() will return W_LENFORMT.
  773.  
  774.     The last parameter in the winpdef() function is validate.  This
  775.     parameter is the address of an optional user validation/modification
  776.     function.  If no validation function is to be used, then specify NULL.
  777.     Your user validation/modification function must be declared like:
  778.  
  779.  
  780.                                       13   
  781.  
  782.                     int func(char *str);
  783.  
  784.     where str is the address of the input field that will be passed to it.
  785.     Once your user function has the address of the input field, you can
  786.     validate and/or modify the input field. Your function can also display
  787.     an error message, sound a bell, or just about anything. When your
  788.     function is done, it must return 0 for no error.
  789.  
  790.     Once you have defined all input fields with winpdef(), you call
  791.     winpread() to process them.  The user is allowed to move around and edit
  792.     all of the fields.  The input fields are validated on the fly and after
  793.     entering the last field.  Valid editing keys are:
  794.      
  795.             LeftArrow       - moves cursor left a position.
  796.             RightArrow      - moves cursor right a position.
  797.             UpArrow         - moves cursor to the previous field up.
  798.             DownArrow       - moves cursor to the next field down.
  799.             Ctrl-LeftArrow  - moves cursor to previous word left.
  800.             Ctrl-RightArrow - moves cursor to next word right.
  801.             Tab             - moves cursor to the next field right.
  802.             Shift-Tab       - moves cursor to the previous field left.
  803.             Enter           - if the cursor is in the last field on the
  804.                               screen, it will process all fields.  Otherwise
  805.                               it will skip to the next field.
  806.             Ctrl-Enter      - processes all fields, wherever cursor may be
  807.             Home            - moves cursor to first position of field.
  808.             End             - moves cursor to last position of field.
  809.             Ctrl-Home       - moves cursor to the first position of the
  810.                               first field on the screen.
  811.             Ctrl-End        - moves cursor to the last position of the last
  812.                               field on the screen.
  813.             Ins             - inserts a space at cursor location.  All text
  814.                               to the right of the cursor will be shifted
  815.                               right. The end character will be dropped.
  816.             Del             - deletes character at the cursor location.  All
  817.                               text to the right of the cursor will be
  818.                               shifted left and a space will be inserted at
  819.                               the end of the field.
  820.             BackSpace       - deletes a character to the left.
  821.             Ctrl-BackSpace  - deletes a word to the left.  Text following
  822.                               the word will be shifted left.
  823.             Ctrl-T          - deletes a word to the right.  Text following
  824.                               the word will be shifted left.
  825.             Ctrl-U          - deletes all characters from current cursor
  826.                               postion to end of field.
  827.             Ctrl-Y          - deletes all characters in all fields from
  828.                               current cursor position to end of last field.
  829.             Esc             - if enabled, cancels input and returns a
  830.                               W_ESCPRESS value.  Escape checking can be
  831.                               enabled or disabled by calling the wsetesc()
  832.                               function before winpread() is called.
  833.  
  834.     After the winpread() function is called, all fields defined with
  835.     winpdef() will be cleared.  The receiving strings of all defined fields
  836.     will now contain the data entered.  If Escape checking was on and the
  837.     Esc key was pressed, then all receiving strings will contain the values
  838.  
  839.  
  840.                                       14   
  841.     they held before winpread() was called and W_ESCPRESS will be returned.
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.                                       15   
  901.  
  902.  
  903.     Bar-Selection Menu Functions.
  904.  
  905.     Two functions are needed to use CXL's bar-selection menus:  wmenudef(),
  906.     and wmenuget().  These two functions can be used as part of a pull-down,
  907.     pop-up, Lotus-style, or any other bar-selection menu system.  The
  908.     wmenudef() function defines a menu record in memory and displays the
  909.     menu option on the screen.  The wmenuget() function processes the user's
  910.     selection and deallocates the defined menu records.
  911.  
  912.     The wmenudef() function accepts 7 parameters.  The first two parameters,
  913.     wrow and wcol, indicate where in the active window the menu option will
  914.     be displayed.  The 3rd parameter, attr, is the text attribute of the
  915.     menu option.  The 4th parameter, str, is the address of the string
  916.     containing the menu option.  The 5th parameter, tagchar, is used for
  917.     identification of the menu option. The tag character may be any ASCII
  918.     character (value 0 - 255).  Lower case tag characters will automatically
  919.     be converted to upper case.  The 6th parameter, tagattr, is the
  920.     attribute of the tag character (if the tag character is present in the
  921.     menu option).  The last parameter, desc, is the address of a text
  922.     description of the menu option.  This is only used if you plan to use
  923.     Lotus-sytle menus, otherwise specify NULL.
  924.  
  925.     When all menu options have been defined, you will call the wmenuget()
  926.     function.  The first argument to wmenuget() is the attribute of the
  927.     selection bar.  The second argument is the tag character of where you
  928.     want the selection bar to initially be located.  If an undefined tag
  929.     character is used, then the initial position of the selection bar will
  930.     default to the upper-leftmost option.  The third argument of wmenuget()
  931.     is the pulldown parameter.  This is used for a pull-down menu system.
  932.     If a pull-down menu system is not being used, then the pulldown
  933.     parameter should be specified as zero.
  934.      
  935.     If you are using pull-down menus, then the pulldown parameter may have
  936.     one of four values.  PDMAIN is used to signify that the menu you have
  937.     just defined is to be the main menu (usually the horizontal bar across
  938.     the top) of a pull-down menu system.  PDMENU is used to signify that the
  939.     menu you have just defined is one of the pull-down menus from the main
  940.     menu.  The other two values that the pulldown parameter can have are
  941.     used for movement between pull-down menus.  PDPREV is used to signify
  942.     that the menu you have just defined is the main menu and you wish to
  943.     automatically select the option previous to the specified taginit.
  944.     PDNEXT is used to signify that the menu you have just defined is the
  945.     main menu and you wish to automatically select the next option after the
  946.     specified taginit.
  947.      
  948.     A mouse can be used for motion/selection of menu options.  The mouse
  949.     must first be initialized with a call to msinit().  It is also
  950.     recommended that you adjust the mouse sensitivity by calling
  951.     msspeed(128,32) - the recommended settings for pull-down menus.
  952.  
  953.     Keyboard movement/selection keys that can be used during the wmenuget()
  954.     function are:
  955.      
  956.         LeftArrow   - moves selection bar to previous option left.  If
  957.                       inside a pull-down menu, pressing this will cause
  958.  
  959.  
  960.                                       16   
  961.                       wmenuget() to return PDPREV.
  962.         RightArrow  - moves selection bar to next option right.  If inside a
  963.                       pull-down menu, pressing this will cause wmenuget() to
  964.                       return PDNEXT.
  965.         UpArrow     - moves selection bar to previous option up.
  966.         DownArrow   - moves selection bar to next option down.  If pull-down
  967.                       menus are being used and you are currently in the main
  968.                       menu, then the option that the selection bar is on is
  969.                       selected.
  970.         Tab         - moves selection bar to next option right.
  971.         Shift-Tab   - moves selection bar to previous option left.
  972.         Enter       - selects the option that the selection bar is on.
  973.                       Pressing the left mouse button will have the same
  974.                       effect.
  975.         Home        - moves selection bar to upper left option.
  976.         End         - moves selection bar to lower right option.
  977.         Esc         - if enabled, cancels input and returns a zero.  Escape
  978.                       checking can be enabled or disabled by using the
  979.                       wsetesc() function before wmenuget() is called.  If
  980.                       inside a pull-down menu, pressing this will cause
  981.                       wmenuget() to return PDMAIN.  Pressing the right mouse
  982.                       button will have the same effect.
  983.      
  984.     When an option is selected, it's tag character will be returned by
  985.     wmenuget().  The tag character will be in the same case as when defined.
  986.     If the Esc key was pressed and Escape checking was on, a zero will be
  987.     returned and the global variable _werrno will be set to W_ESCPRESS.  If
  988.     any other error occurred, the return value will be zero and the global
  989.     variable _werrno will be set to an error code (see CXLWIN.H).  Once a
  990.     selection is made, the wmenuget() function automatically clears all menu
  991.     options defined by wmenudef().
  992.      
  993.     If you are using wmenuget() to process a pull-down menu (PDMENU), and
  994.     the LeftArrow or RightArrow key is pressed, then wmenuget() will return
  995.     PDPREV or PDNEXT, respectively.  This allows you to input these return
  996.     values back into the main menu's wmenuget() pulldown parameter to
  997.     automatically select the previous or next pull-down window from the
  998.     current pull-down window.  The Escape checking status will be ignored
  999.     while inside a pull-down menu.  Instead, if in a pull-down menu
  1000.     (PDMENU), and the Esc key is pressed, wmenuget() will return PDMAIN,
  1001.     which allows you to reinput that value back into the main menu's
  1002.     wmenuget() pulldown parameter.  If your pull-down system needs
  1003.     3rd-level menus, they should be defined as pop-up menus (pulldown = 0).
  1004.      
  1005.     Example for a Vertical Pop-Up Menu:
  1006.      
  1007.         int selection;
  1008.                                         /* open the window */
  1009.         wopen(5,10,20,50,4,LMAGENTA|_RED,LMAGENTA|_RED);
  1010.                                         /* define the menu */
  1011.         wmenudef(2,2,LGREEN|_RED,"Add record",'A',WHITE|_RED,NULL);
  1012.         wmenudef(4,2,LGREEN|_RED,"Delete record",'D',WHITE|_RED,NULL);
  1013.         wmenudef(6,2,LGREEN|_RED,"Print record",'P',WHITE|_RED,NULL);
  1014.         wmenudef(8,2,LGREEN|_RED,"Update record",'U',WHITE|_RED,NULL);
  1015.                                         /* process the menu, load
  1016.                                            selection bar at the
  1017.                                            definition for 'A' */
  1018.  
  1019.  
  1020.                                       17   
  1021.         selection=wmenuget(LRED|_GREEN,'A',0);
  1022.         wclose();                       /*  close the window */
  1023.  
  1024.  
  1025.     Example for a Horizontal Lotus-Style Menu:
  1026.  
  1027.         int selection;
  1028.                                         /* open the window */
  1029.         wopen(7,15,10,65,0,YELLOW,LCYAN|_BLUE);
  1030.                                         /* define the menu */
  1031.         wmenudef(0,0,LMAGENTA|_BLUE,"Add",'A',WHITE|_BLUE,
  1032.             "Create a new record");
  1033.         wmenudef(0,8,LMAGENTA|_BLUE,"Delete",'D',WHITE|_BLUE,
  1034.             "Delete an existing record");
  1035.         wmenudef(0,19,LMAGENTA|_BLUE,"Print",'P',WHITE|_BLUE,
  1036.             "Print hardcopy of existing record");
  1037.         wmenudef(0,28,LMAGENTA|_BLUE,"Show",'S',WHITE|_BLUE,
  1038.             "Display an existing record on screen");
  1039.         wmenudef(0,36,LMAGENTA|_BLUE,"Update",'U',WHITE|_BLUE,
  1040.             "Modify an existing record");
  1041.         wmenudef(0,45,LMAGENTA|_BLUE,"Quit",'Q',WHITE|_BLUE,
  1042.             "Quit program and return to DOS");
  1043.         wtextattr(LGREEN|_BLUE);        /* attribute of text description */
  1044.                                         /* process the menu, load the
  1045.                                            selection bar at 'A'dd.       */
  1046.         selection=wmenuget(YELLOW|_LGREY,'A',0);
  1047.         wclose();                       /*  close the window */
  1048.  
  1049.  
  1050.     Model for a Complete Pull-Down Menu System:
  1051.  
  1052.         int m1,m2;
  1053.  
  1054.         m1='F';                         /* init main menu */
  1055.         m2=PDMAIN;
  1056.         while(m1) {                     /* or use " for(;;) { " */
  1057.             wmenudef(     );            /* define main menu */
  1058.             wmenudef(     );
  1059.             wmenudef(     );
  1060.             m1=wmenuget(attrib,m1,m2);  /* get main menu selection */
  1061.             switch(m1) {                /* test main menu selection */
  1062.                 case 'F':
  1063.                     wopen(   );         /* open pull-down menu */
  1064.                     m2='L';             /* init pull-down menu */
  1065.                     while(m2>PDMENU) {
  1066.                         wmenudef(   );  /* define pull-down menu */
  1067.                         wmenudef(   );
  1068.                         wmenudef(   );
  1069.                                         /* get pull-down menu selection */
  1070.                         m2=wmenuget(attrib,m2,PDMENU);
  1071.                         switch(m2) {    /* test pull-down menu selection */
  1072.                             case 'A':
  1073.                                 funca();
  1074.                                 break
  1075.                             case 'B':
  1076.                                 funcb();
  1077.                                 break;
  1078.  
  1079.  
  1080.                                       18   
  1081.                         }
  1082.                     }
  1083.                     wclose();           /* close pull-down menu */
  1084.                     break;
  1085.                 case 'E':
  1086.                     ....
  1087.                     break;
  1088.                 case 'D':
  1089.                     ....
  1090.                     break;
  1091.             }
  1092.         }
  1093.  
  1094.  
  1095.  
  1096.  
  1097.  
  1098.  
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111.  
  1112.  
  1113.  
  1114.  
  1115.  
  1116.  
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127.  
  1128.  
  1129.  
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.  
  1140.                                       19   
  1141.  
  1142.  
  1143.     String Selection Functions.
  1144.  
  1145.     There are two functions needed for string selection:  wsseldef() and
  1146.     wsselget().  The wsseldef() function defines a string selection record
  1147.     and is called for every string selection you want to define.  
  1148.  
  1149.     The wsselget() function processes all of the defined string selection
  1150.     records and returns the address of the string that was selected.  The
  1151.     following keys can be during string selection:
  1152.  
  1153.         Enter       - selects the displayed selection string
  1154.         LeftArrow   - previous selection string
  1155.         UpArrow     -    "         "       "
  1156.         Shift-Tab   -    "         "       "
  1157.         RightArrow  - next selection string
  1158.         DownArrow   -  "       "       "
  1159.         Tab         -  "       "       "
  1160.         Esc         - if Escape checking is on, then pressing this will
  1161.                       cause wsselget() to return NULL and set the global
  1162.                       variable _werrno to W_ESCPRESS.  Escape checking is
  1163.                       on by default, but you can use wsetesc(0) to turn it
  1164.                       off.
  1165.  
  1166.     This is the way it works:
  1167.  
  1168.         char *prn;
  1169.         FILE *fpout;
  1170.         ....
  1171.         wsseldef("PRN");                /* define each possible string */
  1172.         wsseldef("LPT1");
  1173.         wsseldef("LPT2");
  1174.         wsseldef("COM1");
  1175.         wsseldef("COM2");
  1176.         wputs("Select printer:  ");     /* display prompt */
  1177.         prn=wsselget(YELLOW|_BLUE);     /* get selection from keyboard */
  1178.         if(prn==NULL) {                 /* test for error */
  1179.             error_routine();
  1180.         }
  1181.         fpout=fopen(prn,"w");
  1182.         ....
  1183.  
  1184.     What the display would initially look like is:
  1185.  
  1186.         Select printer:  PRN
  1187.  
  1188.     and by using the arrow keys, you can change the selection.  Once Enter
  1189.     is pressed, the selection will be made.
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.                                       20   
  1201.  
  1202.      
  1203.     Expanded Memory (EMS) Functions.
  1204.  
  1205.     CXL contains several functions for simple management of expanded
  1206.     memory. All of CXL's EMS functions are prefixed with 'ems'.  For those
  1207.     not familiar with expanded memory, I will briefly explain it.
  1208.      
  1209.     The 8088 microprocessor is only able to address 1 Megabyte of memory.
  1210.     When applications started needing more memory, Lotus, Intel, and
  1211.     Microsoft developed the Expanded Memory Specification.  This
  1212.     specification allows access to more than 1 Megabyte of memory by mapping
  1213.     16K 'windows' of memory on an expanded memory board in and out of an
  1214.     unused area of DOS memory.  The Expanded Memory Manager (EMM) is a
  1215.     software driver that controls the mapping.
  1216.      
  1217.     Physical pages are 16K blocks of memory which are located in an unused
  1218.     area of DOS memory.  There are typically 4 physical pages comprising a
  1219.     64K contiguous area of mappable DOS memory.  The EMS page frame base
  1220.     address points to the beginning of the first physical page.  Logical
  1221.     pages are 16K blocks of memory on the expanded memory board.  There can
  1222.     be as many logical pages as the expanded memory board has, up to 8
  1223.     Megabytes.
  1224.      
  1225.     Every program that uses expanded memory must do the following:
  1226.      
  1227.         1.  determine if the EMM device driver is loaded
  1228.         2.  determine if there are enough free pages for its application
  1229.         3.  allocate pages of expanded memory
  1230.         4.  find out what the EMS page frame base address is
  1231.         5.  map logical pages onto physical pages
  1232.         6.  deallocate pages when finished with them
  1233.      
  1234.     Here's an example of using CXL's EMS functions to perform these
  1235.     procedures:
  1236.      
  1237.         int handle1,handle2;
  1238.         char buf[14];
  1239.         if(!emsexist()) {               /*  check for the EMM driver    */
  1240.             printf("EMM not loaded\n");
  1241.             exit(1);
  1242.         }
  1243.         handle1=emsalloc(2);            /*  request 2 pages of EMS
  1244.                                             memory                      */
  1245.         handle2=emsalloc(2);            /*  request 2 more pages        */
  1246.         if(handle1==-1 || handle2==-1) {/*  test for allocation error   */
  1247.             printf("EMS allocation error\n");
  1248.             exit(1);
  1249.         }
  1250.         emsmap(handle1,0,0);            /*  map logical page 0 of handle
  1251.                                             1 to physical page 0        */
  1252.         emswrite("Hello, world",0,13);  /*  write a string at offset 0,
  1253.                                             automatically determines what
  1254.                                             the page frame address is   */
  1255.         emsmap(handle2,0,0);            /*  map logical page 0 of handle
  1256.                                             2 to physical page 0        */
  1257.         emswrite("How are you?",0,13);  /*  write a string at offset 0  */
  1258.  
  1259.  
  1260.                                       21   
  1261.         emsmap(handle1,0,0);            /*  map logical page 0 of handle
  1262.                                             1 to physical page 0        */
  1263.         emsread(buf,0,13);              /*  read 13 bytes from offset 0
  1264.                                             into buffer                 */
  1265.         printf("buf = %s\n",buf);       /*  display buffer contents     */
  1266.         emsmap(handle2,0,0);            /*  map logical page 0 of handle
  1267.                                             2 to physical page 0        */
  1268.         emsread(buf,0,13);              /*  read 13 bytes from offset 0
  1269.                                             into buffer                 */
  1270.         printf("buf = %s\n",buf);       /*  display buffer contents     */
  1271.         emsdealloc(handle2);            /*  deallocate pages belonging
  1272.                                             to handle 2                 */
  1273.         emsdealloc(handle1);            /*  deallocate pages belonging
  1274.                                             to handle 1                 */
  1275.  
  1276.  
  1277.  
  1278.  
  1279.  
  1280.  
  1281.  
  1282.  
  1283.  
  1284.  
  1285.  
  1286.  
  1287.  
  1288.  
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297.  
  1298.  
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.                                       22   
  1321.  
  1322.      
  1323.     Mouse Functions.
  1324.      
  1325.     CXL has several functions used to facilitate Microsoft compatible mice.
  1326.     All of these functions are prefixed with am 'ms'.  These functions will
  1327.     work on Microsoft mice or other mice using a Microsoft compatible
  1328.     driver.  These mouse functions allow you to:
  1329.      
  1330.         1.  Initialize mouse/determine if mouse exists.
  1331.         2.  Get the status of button presses/releases.
  1332.         3.  Hide/reveal the mouse cursor.
  1333.         4.  Get/set the mouse cursor position.
  1334.         5.  Select type of mouse cursor (hardware or software).
  1335.         6.  Adjust the mouse sensitivity (speed).
  1336.         7.  Get information on direction of mouse movement.
  1337.         8.  Establish horizontal/vertical boundaries of mouse movement.
  1338.      
  1339.     When reading or setting mouse coordinates, the values used are in
  1340.     pixels. To calculate mouse coordinates in terms of column and row
  1341.     instead of X and Y, you would multiply character width by column, and
  1342.     character height by row. Typically, screen characters are 8 pixels wide
  1343.     by 8 pixels tall.  So, to position the mouse cursor at column 60, row
  1344.     15, you would use:
  1345.      
  1346.         msgotoxy(60*8,15*8);
  1347.      
  1348.     The mscursor() function sets the cursor type.  It takes 3 parameters:
  1349.     ctype, smask, and cmask.  If ctype = 1 then the cursor type is hardware.
  1350.     The hardware cursor is the flashing block on your screen.  If this type
  1351.     of cursor is used, it will interfere with normal text cursor functions.
  1352.     When using the hardware cursor type, the value for smask is the start
  1353.     scan line of the cursor, and the value for cmask is the stop scan line
  1354.     of the cursor.  If the ctype parameter = 0, then a software cursor is
  1355.     used.  For the software cursor, the smask parameter is the screen mask,
  1356.     and the cmask parameter is the cursor mask.  The screen mask determines
  1357.     which of the characters attributes are preserved.  The cursor mask
  1358.     defines how the attributes are changed to show the cursor.  For both
  1359.     masks, the bit values are as follows:
  1360.      
  1361.              Bits 0-7:       ASCII value of character
  1362.              Bits 8-10:      Foreground color
  1363.              Bit 11:         Intensity
  1364.              Bits 12-14:     Background color
  1365.              Bit 15:         Blink
  1366.      
  1367.     The msmotion() function determines direction and distance traveled since
  1368.     last msmotion() call.  The xcount and ycount parameters will either be
  1369.     negative or positive depending on direction mouse moved.  The amount
  1370.     will be the number of pixels travelled.
  1371.      
  1372.     When updating the screen, the mouse cursor should be hidden with the
  1373.     mshidecur() function first, and then after the screen is updated, the
  1374.     msshowcur() should be called to re-display the mouse cursor.
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.                                       23   
  1381.  
  1382.  
  1383.                                GLOBAL VARIABLES
  1384.  
  1385.      
  1386.     Name:       _cgasnow
  1387.     Purpose:    a flag that tells CXL's functions whether or not to use
  1388.                 CGA snow reduction.  Defaults to 0 (off).  To enable CGA
  1389.                 snow reduction, set this variable to 1.
  1390.     Type:       int
  1391.  
  1392.  
  1393.     Name:       _kbloop
  1394.     Purpose:    points to a procedure to be called while waiting for a
  1395.                 keypress.
  1396.     Type:       void (*) (void)
  1397.  
  1398.  
  1399.     Name:       _mouse
  1400.     Purpose:    this is set by the msinit() function.  It contains a zero
  1401.                 if a mouse is not installed or a non-zero if mouse is
  1402.                 installed.
  1403.     Type:       int
  1404.  
  1405.  
  1406.     Name:       _onkey
  1407.     Purpose:    a pointer which points to the highest defined onkey record.
  1408.     Type:       struct _onkey_t *   (see CXLKEY.H for definition)
  1409.  
  1410.  
  1411.     Name:       _videoseg
  1412.     Purpose:    contains the current video RAM segment address used by
  1413.                 direct screen writes.  Defaults to 0xb800.  The videoinit()
  1414.                 function may update this variable.
  1415.     Type:       unsigned int
  1416.      
  1417.      
  1418.     Name:       _werrno
  1419.     Purpose:    contains the error code from the most recently performed
  1420.                 windowing function.  See CXLWIN.H for a complete list of
  1421.                 possible error codes.
  1422.     Type:       int
  1423.      
  1424.      
  1425.     Name:       _wesc
  1426.     Purpose:    Escape key checking flag.  This is set by the wsetesc()
  1427.                 function and used by several window keyboard input
  1428.                 functions.
  1429.     Type:       int
  1430.      
  1431.      
  1432.     Name:       _whandle
  1433.     Purpose:    contains the last handle number given to a window.
  1434.     Type:       WINDOW
  1435.  
  1436.      
  1437.     Name:       _winp
  1438.  
  1439.  
  1440.                                       24   
  1441.     Purpose:    a pointer to the highest defined window keyboard input
  1442.                 record.
  1443.     Type:       struct _winp_t *  (see CXLWIN.H for definition)
  1444.      
  1445.      
  1446.     Name:       _wmenu
  1447.     Purpose:    a pointer to the highest defined bar-selection menu
  1448.                 record.
  1449.     Type:       struct _wmenu_t *  (See CXLWIN.H for definition)
  1450.      
  1451.      
  1452.     Name:       _wrec
  1453.     Purpose:    a pointer to the active window's record.
  1454.     Type:       struct _wrec_t *   (see CXLWIN.H for definition)
  1455.  
  1456.  
  1457.     Name:       _wsel
  1458.     Purpose:    a pointer to the highest defined string selection record.
  1459.     Type:       struct _wsel_t *  (see CXLWIN.H for definition)
  1460.  
  1461.  
  1462.     Name:       _wtotal
  1463.     Purpose:    contains the total number of open windows
  1464.     Type:       int
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472.  
  1473.  
  1474.  
  1475.  
  1476.  
  1477.  
  1478.  
  1479.  
  1480.  
  1481.  
  1482.  
  1483.  
  1484.  
  1485.  
  1486.  
  1487.  
  1488.  
  1489.  
  1490.  
  1491.  
  1492.  
  1493.  
  1494.  
  1495.  
  1496.  
  1497.  
  1498.  
  1499.  
  1500.                                       25   
  1501.  
  1502.      
  1503.                               LIBRARY FUNCTIONS
  1504.      
  1505.      
  1506.     Name:       attrib
  1507.     Purpose:    creates an attribute.
  1508.     Prototype:  int attrib(int fore,int back,int bright,int blink);
  1509.     Header:     cxlvid.h  cxlwin.h
  1510.     Inputs:     fore    - foreground color code (0-7)
  1511.                 back    - background color code (0-7)
  1512.                 bright  - intensity (0-1)
  1513.                 blink   - blinking (0-1)
  1514.     Return:     attribute
  1515.     Also see:   setattr wtextattr
  1516.     Example:
  1517.                 prints(15,10,attrib(7,5,1,0),"Hello, world");
  1518.      
  1519.      
  1520.     Name:       beep
  1521.     Purpose:    sounds a beep in the speaker.
  1522.     Prototype:  void beep(void);
  1523.     Header:     cxldef.h cxlvid.h
  1524.     Inputs:     none
  1525.     Return:     none
  1526.     Also see:   sound_
  1527.     Example:
  1528.                 beep();
  1529.      
  1530.      
  1531.     Name:       biosver
  1532.     Purpose:    returns the ROM BIOS version date.
  1533.     Prototype:  char *biosver(void);
  1534.     Header:     cxldef.h
  1535.     Inputs:     none
  1536.     Return:     address of the static string containing the ROM BIOS
  1537.                 version date
  1538.     Also see:   machid
  1539.     Example:
  1540.                 printf("ROM BIOS version date is %s\n",biosver());
  1541.      
  1542.      
  1543.     Name:       box_
  1544.     Purpose:    displays a text box on the screen.
  1545.     Prototype:  void box_(int srow,int scol,int erow,int ecol,int btype,
  1546.                           int attr);
  1547.     Header:     cxlvid.h
  1548.     Inputs:     srow    - starting row upper left corner
  1549.                 scol    - starting column upper left corner
  1550.                 erow    - ending row lower right corner
  1551.                 ecol    - ending column
  1552.                 btype   - box type (0-5)
  1553.                 attr    - attribute
  1554.     Return:     none
  1555.     Also see:   boxd
  1556.     Example:
  1557.                 box_(0,0,22,79,1,WHITE|_BLUE);
  1558.  
  1559.  
  1560.                                       26   
  1561.      
  1562.       
  1563.     Name:       boxd
  1564.     Purpose:    displays a text box directly on the screen (no BIOS calls).
  1565.     Prototype:  void boxd(int srow,int scol,int erow,int ecol,int btype,
  1566.                           int attr);
  1567.     Header:     cxlvid.h
  1568.     Inputs:     srow    - starting row upper left corner
  1569.                 scol    - starting column upper left corner
  1570.                 erow    - ending row lower right corner
  1571.                 ecol    - ending column
  1572.                 btype   - box type (0-5)
  1573.                 attr    - attribute
  1574.     Return:     none
  1575.     Also see:   box_ videoinit
  1576.     Example:
  1577.                 boxd(0,0,22,79,1,WHITE|_BLUE);
  1578.      
  1579.       
  1580.     Name:       capsoff
  1581.     Purpose:    toggles the CapsLock key off.
  1582.     Prototype:  void capsoff(void);
  1583.     Header:     cxlkey.h
  1584.     Inputs:     none
  1585.     Return:     none
  1586.     Also see:   capson kbstat numoff
  1587.     Example:
  1588.                 capsoff();
  1589.      
  1590.  
  1591.     Name:       capson
  1592.     Purpose:    toggles the CapsLock key on.
  1593.     Prototype:  void capson(void);
  1594.     Header:     cxlkey.h
  1595.     Inputs:     none
  1596.     Return:     none
  1597.     Also see:   capsoff kbstat numon
  1598.     Example:
  1599.                 capson();
  1600.      
  1601.      
  1602.     Name:       clearkeys
  1603.     Purpose:    clears the keyboard buffer.
  1604.     Prototype:  void clearkeys(void);
  1605.     Header:     cxlkey.h
  1606.     Inputs:     none
  1607.     Return:     none
  1608.     Also see:   waitkey
  1609.     Example:
  1610.                 clearkeys();
  1611.      
  1612.      
  1613.     Name:       clockcal
  1614.     Purpose:    determines if a clock-calendar board is installed (usually
  1615.                 this board will only be in XT machines).
  1616.     Prototype:  int clockcal(void);
  1617.     Header:     cxldef.h
  1618.  
  1619.  
  1620.                                       27   
  1621.     Inputs:     none
  1622.     Return:     a non-zero value if a clock-calendar board is present
  1623.     Example:
  1624.                 printf("A clock-calendar is%s installed\n",
  1625.                     clockcal()?"":" not");
  1626.      
  1627.      
  1628.     Name:       clreol_
  1629.     Purpose:    clears to the end of line using current attribute.
  1630.     Prototype:  void clreol_(void);
  1631.     Header:     cxlvid.h
  1632.     Inputs:     none
  1633.     Return:     none
  1634.     Also see:   clrscrn clrwin
  1635.     Example:
  1636.                 clreol_();
  1637.      
  1638.      
  1639.     Name:       clrscrn
  1640.     Purpose:    clears the screen (up to 50 lines) using current attribute,
  1641.                 and homes the cursor.
  1642.     Prototype:  void clrscrn(void);
  1643.     Header:     cxlvid.h
  1644.     Inputs:     none
  1645.     Return:     none
  1646.     Also see:   clreol_ clrwin
  1647.     Example:
  1648.                 clrscrn();
  1649.      
  1650.       
  1651.     Name:       clrwin
  1652.     Purpose:    clears a window of the screen using current attribute.
  1653.     Prototype:  void clrwin(srow,scol,erow,ecol);
  1654.     Header:     cxlvid.h
  1655.     Inputs:     srow    - starting row upper left corner
  1656.                 scol    - starting column upper left corner
  1657.                 erow    - ending row lower right corner
  1658.                 ecol    - ending column lower right corner
  1659.     Return:     none
  1660.     Also see:   clreol_ clrscrn
  1661.     Example:
  1662.                 clrwin(11,11,19,19);
  1663.      
  1664.      
  1665.     Name:       cvaltype
  1666.     Purpose:    checks given character against a given CXL character type
  1667.                 code, determines if character is valid type.
  1668.     Prototype:  int cvaltype(int ch,int ctype);
  1669.     Header:     cxlstr.h
  1670.     Inputs:     ch      - character to test
  1671.                 ctype   - character type code to compare with, see section
  1672.                           on CXL format strings for a list of valid
  1673.                           character type codes.
  1674.     Return:     a 0 if character is not valid, a 1 if character is valid, or
  1675.                 a -1 if invalid ctype was given
  1676.                 zero
  1677.     Example:
  1678.  
  1679.  
  1680.                                       28   
  1681.                 int valid=0;
  1682.                 char ch='Z';
  1683.                 valid=cvaltype(ch,'#');
  1684.                 printf("%c is %sa valid char of type '#'\n",ch,
  1685.                     valid?"":" not");
  1686.      
  1687.      
  1688.     Name:       delay_
  1689.     Purpose:    delays program execution for a specified duration.
  1690.     Prototype:  void delay_(unsigned duration);
  1691.     Header:     cxldef.h
  1692.     Inputs:     duration    - duration (0-65535) ie. 18 = 1 second
  1693.     Return:     none
  1694.     Also see:   timer waitkeyt
  1695.     Example:
  1696.                 delay_(36);             /* delays for 2 seconds */
  1697.      
  1698.      
  1699.     Name:       disktoscrn
  1700.     Purpose:    copies a previously saved screen disk file back to the
  1701.                 screen.
  1702.     Prototype:  int disktoscrn(char *fname);
  1703.     Header:     cxlvid.h
  1704.     Inputs:     fname   - address of the string containing file name to
  1705.                           read from
  1706.     Return:     a zero if no error
  1707.     Also see:   disktowin scrntodisk
  1708.     Example:
  1709.                 if(disktoscrn("SCREEN.DAT")) {
  1710.                     printf("Error reading input file\n");
  1711.                     exit(1);
  1712.                 }
  1713.      
  1714.      
  1715.     Name:       disktowin
  1716.     Purpose:    copies a previously saved window disk file back to the
  1717.                 screen.
  1718.     Prototype:  int disktowin(char *fname);
  1719.     Header:     cxlwin.h
  1720.     Inputs:     fname   - address of the string containing file name to read
  1721.                           from
  1722.     Return:     a zero if no error
  1723.     Also see:   disktoscrn wintodisk
  1724.     Example:
  1725.                 if(disktowin("WINDOW.DAT")) {
  1726.                     printf("Error reading input file\n");
  1727.                     exit(1);
  1728.                 }
  1729.      
  1730.      
  1731.     Name:       emsalloc
  1732.     Purpose:    allocates pages of EMS memory.  See the "Expanded Memory
  1733.                 (EMS) Functions" section for complete details.
  1734.     Prototype:  unsigned emsalloc(int numpages);
  1735.     Header:     cxlems.h
  1736.     Inputs:     numpages  - the number of pages (16K blocks) requested
  1737.     Return:     the EMS handle or a -1 if an error occurred
  1738.  
  1739.  
  1740.                                       29   
  1741.     Also see:   emsdealloc emsexist emsfree
  1742.     Example:
  1743.                 int emm_handle;
  1744.                 ......
  1745.                 emm_handle=emsalloc(2); /*  request 2 pages (32K)   */
  1746.                 if(emm_handle==-1) {
  1747.                     printf("EMS allocation error\n");
  1748.                     exit(1);
  1749.                 }
  1750.      
  1751.      
  1752.     Name:       emsdealloc
  1753.     Purpose:    deallocate previously allocated pages of EMS memory. 
  1754.     Prototype:  int emsdealloc(int handle);
  1755.     Header:     cxlems.h
  1756.     Inputs:     handle  - the previously assigned EMS handle
  1757.     Return:     a 0 if no error or else an EMS error code
  1758.     Also see:   emsalloc
  1759.     Example:
  1760.                 if(emsdealloc(emm_handle)) {
  1761.                     printf("EMS deallocation error\n");
  1762.                     exit(1);
  1763.                 }
  1764.      
  1765.  
  1766.     Name:       emsexist
  1767.     Purpose:    determines if the EMS device driver is loaded.  See the
  1768.                 "Expanded Memory (EMS) Functions" section for complete
  1769.                 details.
  1770.     Prototype:  int emsexist(void);
  1771.     Header:     cxlems.h
  1772.     Inputs:     none
  1773.     Return:     a 0 if EMS driver not loaded, or a 1 if EMS driver is loaded
  1774.     Also see:   emsfree emstotal expmem
  1775.     Example:
  1776.                 printf("EMS device driver is %sloaded\n",
  1777.                     (emsexist())?"":"not ");
  1778.      
  1779.      
  1780.     Name:       emsframe
  1781.     Purpose:    returns the EMS page frame base address (segment).
  1782.     Prototype:  unsigned emsframe(void);
  1783.     Header:     cxlems.h
  1784.     Inputs:     none
  1785.     Return:     the EMS page frame base address (segment) or a zero if an
  1786.                 error occurred
  1787.     Also see:   emsmap
  1788.     Example:
  1789.                 printf("EMS page frame address is at:  %X\n",emsframe());
  1790.      
  1791.      
  1792.     Name:       emsfree
  1793.     Purpose:    returns the number of free EMS pages (16K blocks).
  1794.     Prototype:  unsigned emsfree(void);
  1795.     Header:     cxlems.h
  1796.     Inputs:     none
  1797.     Return:     the number of free EMS pages
  1798.  
  1799.  
  1800.                                       30   
  1801.     Also see:   emsalloc emstotal
  1802.     Example:
  1803.                 printf("Free EMS pages:  %u\n",emsfree());
  1804.      
  1805.      
  1806.     Name:       emsmap
  1807.     Purpose:    maps a logical EMS page onto a physical page address.  The
  1808.                 emsalloc() function must be called prior to this.
  1809.     Prototype:  int emsmap(int handle,int lpage,int ppage);
  1810.     Header:     cxlems.h
  1811.     Inputs:     handle  - the EMS handle previosly assigned
  1812.                 lpage   - the logical EMS page to map (0 - ?)
  1813.                 ppage   - the physical DOS page to map to (0 - 3)
  1814.     Return:     a zero if no error, or else an EMS error code
  1815.     Also see:   emsalloc emsframe
  1816.     Example:
  1817.                 if(emsmap(ems_handle,0,0)) {
  1818.                     printf("Error mapping logical page 0 "
  1819.                         "to physical page 0\n");
  1820.                     exit(1);
  1821.                 }
  1822.      
  1823.  
  1824.     Name:       emsread
  1825.     Purpose:    reads bytes from an EMS page(s), emsalloc() and emsmap()
  1826.                 must be called prior to this function.  The source segment
  1827.                 used will be the current EMS page frame address and the
  1828.                 destination segment will be the program's data segment.
  1829.     Prototype:  int emsread(char *dest,unsigned emsofs,unsigned numbytes);
  1830.     Header:     cxlems.h
  1831.     Inputs:     dest     - address to receive bytes read
  1832.                 emsofs   - offset from the EMS page frame base address at
  1833.                            which to read the bytes from
  1834.                 numbytes - the number of bytes to read
  1835.     Return:     a zero if no error
  1836.     Also see:   emsmap emswrite
  1837.     Example:
  1838.                 if(emsread(buf,0x100,64)) {
  1839.                     printf("Failed to read 64 bytes from EMS memory\n");
  1840.                     exit(1);
  1841.                 }
  1842.      
  1843.      
  1844.     Name:       emstotal
  1845.     Purpose:    returns the total number of EMS pages (16K blocks) on the
  1846.                 system.
  1847.     Prototype:  unsigned emstotal(void);
  1848.     Header:     cxlems.h
  1849.     Inputs:     none
  1850.     Return:     the total number of EMS pages on the system or a zero if an
  1851.                 error occurred
  1852.     Also see:   emsfree expmem
  1853.     Example:
  1854.                 printf("You have %u pages of EMS memory\n",emstotal());
  1855.  
  1856.      
  1857.     Name:       emsver
  1858.  
  1859.  
  1860.                                       31   
  1861.     Purpose:    returns the current EMS version.
  1862.     Prototype:  char *emsver(void);
  1863.     Header:     cxlems.h
  1864.     Inputs:     none
  1865.     Return:     the address of the static string containing the EMS version
  1866.                 number or NULL if error
  1867.     Example:
  1868.                 printf("Your EMS version is %s\n",emsver());
  1869.      
  1870.      
  1871.     Name:       emswrite
  1872.     Purpose:    writes bytes to an EMS page(s), emsalloc() and emsmap() must
  1873.                 be called prior to this function.  The source segment will
  1874.                 be the program's DATA segment and the destination segment
  1875.                 will be the EMS current EMS page frame address.
  1876.     Prototype:  int emswrite(char *src,unsigned emsofs,unsigned numbytes);
  1877.     Header:     cxlems.h
  1878.     Inputs:     src      - address of where to write bytes from
  1879.                 emsofs   - offset from EMS page frame base address of where
  1880.                            to write bytes to
  1881.                 numbytes - number of bytes to write
  1882.     Return:     a zero if no error
  1883.     Also see:   emsframe emsmap emsread
  1884.     Example:
  1885.                 if(emswrite(buf,0x100,64)) {
  1886.                     printf("Failed to write 64 bytes to EMS memory\n");
  1887.                     exit(1);
  1888.                 }
  1889.      
  1890.      
  1891.     Name:       expmem
  1892.     Purpose:    determines the amount (if any) of expanded memory on the
  1893.                 system.
  1894.     Prototype:  unsigned expmem(void);
  1895.     Header:     cxldef.h cxlems.h
  1896.     Inputs:     none
  1897.     Return:     the amount of expanded memory in kilobytes
  1898.     Also see:   emsexist extmem
  1899.     Example:
  1900.                 printf("Amt of expanded memory = %uK\n",expmem());
  1901.      
  1902.      
  1903.     Name:       extmem
  1904.     Purpose:    determines the amount of extended memory on an AT machine.
  1905.     Prototype:  unsigned extmem(void);
  1906.     Header:     cxldef.h
  1907.     Inputs:     none
  1908.     Return:     the amount of extended memory in kilobytes
  1909.     Also see:   expmem
  1910.     Example:
  1911.                 printf("Amt of extended memory = %uK\n",extmem());
  1912.      
  1913.      
  1914.     Name:       fill_
  1915.     Purpose:    fills in a region of the screen with specified
  1916.                 character/attribute.
  1917.     Prototype:  void fill_(int srow,int scol,int erow,int ecol,int ch,
  1918.  
  1919.  
  1920.                                       32   
  1921.                            int attr);
  1922.     Header:     cxlvid.h
  1923.     Inputs:     srow    - starting row upper left corner
  1924.                 scol    - starting column upper left corner
  1925.                 erow    - ending row lower left corner
  1926.                 ecol    - ending column lower left corner
  1927.                 ch      - character to fill with
  1928.                 attr    - attribute of character
  1929.     Return:     none
  1930.     Also see:   attrib filld
  1931.     Example:
  1932.                 fill_(2,2,9,9,' ',WHITE|_RED);
  1933.      
  1934.       
  1935.     Name:       filld
  1936.     Purpose:    fills in a region of the screen with specified
  1937.                 character/attribute by writing directly to the screen (no
  1938.                 BIOS calls).
  1939.     Prototype:  void filld(int srow,int scol,int erow,int ecol,int ch,
  1940.                            int attr);
  1941.     Header:     cxlvid.h
  1942.     Inputs:     srow    - starting row upper left corner
  1943.                 scol    - starting column upper left corner
  1944.                 erow    - ending row lower left corner
  1945.                 ecol    - ending column lower left corner
  1946.                 ch      - character to fill with
  1947.                 attr    - attribute of character
  1948.     Return:     none
  1949.     Also see:   attrib fill_ videoinit
  1950.     Example:
  1951.                 filld(2,2,9,9,' ',WHITE|_RED);
  1952.      
  1953.  
  1954.     Name:       gameport
  1955.     Purpose:    determines if a game port is installed.
  1956.     Prototype:  int gameport(void);
  1957.     Header:     cxldef.h
  1958.     Inputs:     none
  1959.     Return:     a zero if game port is not installed, a 1 if installed
  1960.     Also see:   mathchip numflop numpar numser
  1961.     Example:
  1962.                 printf("Game port is %sinstalled\n",
  1963.                     gameport()?"":"not ");
  1964.      
  1965.      
  1966.     Name:       getchf
  1967.     Purpose:    gets a character from the keyboard from a list of valid
  1968.                 characters, provides Escape checking.
  1969.     Prototype:  int getchf(char *valid,int defchar);
  1970.     Header:     cxlkey.h
  1971.     Inputs:     valid   - address of list of valid characters
  1972.                 defchar - default selection in case Enter is pressed, or
  1973.                           a zero for no default
  1974.     Return:     the character pressed or 0 if the Escape key was pressed
  1975.     Also see:   getxch waitkey
  1976.     Example:
  1977.                 int ch;
  1978.  
  1979.  
  1980.                                       33   
  1981.                 ......
  1982.                 ch=getchf("YyNn",'N');
  1983.                 if(!ch) {
  1984.                     printf("Escape was pressed\n");
  1985.                     exit(1);
  1986.                 }
  1987.      
  1988.       
  1989.     Name:       getns
  1990.     Purpose:    inputs a string of specified length from the keyboard,
  1991.                 provides Escape checking.
  1992.     Prototype:  int getns(char *str,int max);
  1993.     Header:     cxlkey.h
  1994.     Inputs:     str     - address of allocated space to receive input string
  1995.                 max     - maximum length of the input string
  1996.     Return:     a 1 if the <Esc> key was pressed
  1997.     Also see:   inputsf
  1998.     Example:
  1999.                 char age[2];
  2000.                 printf("Enter your age:  ");
  2001.                 if(getns(age,2)) {
  2002.                     printf("Escape was pressed\n");
  2003.                     exit(0);
  2004.                 }
  2005.      
  2006.       
  2007.     Name:       getxch
  2008.     Purpose:    gets a key (ASCII code/extended ASCII code) from the
  2009.                 keyboard.  If a mouse is present and initialized, it
  2010.                 can be used.  The mouse movements will translate to
  2011.                 the arrow keys, the left button will translate to
  2012.                 Enter, and the right button will translate to Escape.
  2013.     Prototype:  unsigned getxch(void);
  2014.     Header:     cxlkey.h
  2015.     Inputs:     none
  2016.     Return:     none
  2017.     Also see:   getchf
  2018.     Example:
  2019.                 unsigned int xch;
  2020.                 ......
  2021.                 xch=getxch();
  2022.                 printf("ASCII code = %d, scan code = %d\n",xch,xch>>8);
  2023.      
  2024.      
  2025.     Name:       gotoxy_
  2026.     Purpose:    sets cursor coordinates on the screen.
  2027.     Prototype:  void gotoxy_(int row,int col);
  2028.     Header:     cxlvid.h
  2029.     Inputs:     row     - cursor row (Y coordinate)
  2030.                 col     - cursor column (X coordinate)
  2031.     Return:     none
  2032.     Also see:   readcur
  2033.     Example:
  2034.                 gotoxy_(20,30);     /* set cursor at row 20, column 30 */
  2035.      
  2036.       
  2037.     Name:       inputsf
  2038.  
  2039.  
  2040.                                       34   
  2041.     Purpose:    inputs a formatted string from the keyboard.
  2042.     Prototype:  int inputsf(char *str,char *fmt);
  2043.     Header:     cxlkey.h
  2044.     Inputs:     str     - address of the allocated space to receive string
  2045.                 fmt     - address of the format string, see section on using
  2046.                           format strings
  2047.     Return:     0   - no error
  2048.                 1   - Escape key was pressed
  2049.                 2   - invalid format string
  2050.     Also see:   getns
  2051.     Example:
  2052.                 char phone_nr[25];
  2053.                 ......
  2054.                 inputsf(phone_nr," !RE! 'Enter phone number:  (' ### "
  2055.                                  " ') '###'-'#### ");
  2056.  
  2057.      
  2058.     Name:       kbstat
  2059.     Purpose:    returns the status of the keyboard control keys.
  2060.     Prototype:  unsigned kbstat(void);
  2061.     Header:     cxlkey.h
  2062.     Inputs:     none
  2063.     Return:     status word of the keyboard flag.  You can determine which
  2064.                 key(s) are being pressed/toggled by masking the status with
  2065.                 one of the following:
  2066.                     RSHIFT      - right shift pressed
  2067.                     LSHIFT      - left shift pressed
  2068.                     CTRL        - <Ctrl> pressed
  2069.                     ALT         - <Alt> pressed
  2070.                     SCRLOCK     - <Scroll Lock> toggled
  2071.                     NUMLOCK     - <Num Lock> toggled
  2072.                     CAPSLOCK    - <Caps Lock> toggled
  2073.                     INS         - <Ins> toggled
  2074.     Also see:   capsoff capson numoff numon
  2075.     Example:
  2076.                 if(kbstat()&CTRL) {
  2077.                     printf("The <Ctrl> key is now being pressed\n");
  2078.                 }
  2079.      
  2080.      
  2081.     Name:       lcrlf
  2082.     Purpose:    prints a carriage return and line feed on the printer.
  2083.     Prototype:  void lcrlf(void);
  2084.     Header:     cxlprn.h
  2085.     Inputs:     none
  2086.     Return:     none
  2087.     Also see:   lprintc
  2088.     Example:
  2089.                 lcrlf();
  2090.      
  2091.      
  2092.     Name:       lprintc
  2093.     Purpose:    prints a character on the printer.
  2094.     Prototype:  void lprintc(int ch);
  2095.     Header:     cxlprn.h
  2096.     Inputs:     ch  - the character to print
  2097.     Return:     none
  2098.  
  2099.  
  2100.                                       35   
  2101.     Also see:   lcrlf lprintf
  2102.     Example:
  2103.                 lprintc(0x12);  /* sends a form-feed to the printer */
  2104.      
  2105.      
  2106.     Name:       lprintf
  2107.     Purpose:    sends formatted output to the printer, works like printf().
  2108.     Prototype:  void lprintf(const char *format,...);
  2109.     Header:     cxlprn.h
  2110.     Inputs:     format  - format string, refer to the section on printf() in
  2111.                           the run-time library reference.
  2112.                 ...     - any additional arguments
  2113.     Return:     none
  2114.     Also see:   lprintc lprintns lprints
  2115.     Example:
  2116.                 lprintf("%s %c %d\n",str_arg,char_arg,int_arg);
  2117.      
  2118.      
  2119.     Name:       lprintns
  2120.     Purpose:    prints a string on the printer, formatting width.
  2121.     Prototype:  void lprintns(char *str,int width);
  2122.     Header:     cxlprn.h
  2123.     Inputs:     str     - the address of the string to print
  2124.                 width   - width to print string, uses padding or truncating
  2125.     Return:     none
  2126.     Also see:   lprintf lprints lprintsu
  2127.     Example:
  2128.                 lprintns("Hello, world",5);
  2129.      
  2130.      
  2131.     Name:       lprints
  2132.     Purpose:    prints a string on the printer.
  2133.     Prototype:  void lprints(char *str);
  2134.     Header:     cxlprn.h
  2135.     Inputs:     str     - the address of the string to print
  2136.     Return:     none
  2137.     Also see:   lprintf lprintns lprintsu
  2138.     Example:
  2139.                 lprints("Hello, world\n");
  2140.      
  2141.       
  2142.     Name:       lprintsb
  2143.     Purpose:    prints a bold-faced string on the printer.
  2144.     Prototype:  void lprintsb(char *str);
  2145.     Header:     cxlprn.h
  2146.     Inputs:     str     - the address of the string to print
  2147.     Return:     none
  2148.     Also see:   lprints lprintsu
  2149.     Example:
  2150.                 lprintsb("Hello, world\n");
  2151.      
  2152.       
  2153.     Name:       lprintsu
  2154.     Purpose:    prints an underlined string on the printer.
  2155.     Prototype:  void lprintsu(char *str);
  2156.     Header:     cxlprn.h
  2157.     Inputs:     str     - the address of the string to print
  2158.  
  2159.  
  2160.                                       36   
  2161.     Return:     none
  2162.     Also see:   lprints lprintsb
  2163.     Example:
  2164.                 lprintsu("Hello, world\n");
  2165.      
  2166.       
  2167.     Name:       machid
  2168.     Purpose:    returns the value of the machine ROM ID byte.
  2169.     Prototype:  int machid(void);
  2170.     Header:     cxldef.h
  2171.     Inputs:     none
  2172.     Return:     the value of the machine ROM ID byte.  Will usually be
  2173.                 one of the following values:
  2174.                     IBMPC       - IBM PC
  2175.                     IBMPCXT     - IBM PC/XT
  2176.                     IBMPCJR     - IBM PCjr
  2177.                     IBMPCAT     - IBM PC/AT
  2178.                     IBMPCXT2    - IBM PC/XT-2
  2179.                     IBMCONV     - IBM PC Convertible
  2180.                     SPERRYPC    - Sperry PC
  2181.     Also see:   biosver
  2182.     Example:
  2183.                 if(machid()==IBMPCAT) printf("You have an IBM PC/AT\n");
  2184.      
  2185.      
  2186.     Name:       mathchip
  2187.     Purpose:    determines if a math coprocessor is installed.
  2188.     Prototype:  int mathchip(void);
  2189.     Header:     cxldef.h
  2190.     Inputs:     none
  2191.     Return:     a 1 if a math coprocessor is installed
  2192.     Also see:   gameport numflop numpar numser
  2193.     Example:
  2194.                 printf("Math coprocessor is %sinstalled\n",
  2195.                     mathchip()?"":"not ");
  2196.       
  2197.      
  2198.     Name:       mode
  2199.     Purpose:    sets the video mode.
  2200.     Prototype:  void mode(int mode_code);
  2201.     Header:     cxlvid.h
  2202.     Inputs:     mode_code   - mode code number
  2203.     Return:     none
  2204.     Also see:   setlines vidtype
  2205.     Example:
  2206.                 mode(4);            /* sets CGA graphics mode */
  2207.      
  2208.       
  2209.     Name:       msbpress
  2210.     Purpose:    gets info about specific button presses of mouse.
  2211.     Prototype:  void msbpress(int button,int *bstat,int *bcount,int *x,
  2212.                               int *y);
  2213.     Header:     cxlmou.h
  2214.     Inputs:     button  - button to check, 0 = left button, 1 = right button
  2215.                 bstat   - address to receive button status (0 = not being
  2216.                           pressed, 1 = currently being pressed)
  2217.                 bcount  - address to receive number of times pressed since
  2218.  
  2219.  
  2220.                                       37   
  2221.                           last call
  2222.                 x       - address to receive X pixel coordinate at time of
  2223.                           press
  2224.                 y       - address to receive Y pixel coordinate at time of
  2225.                           press
  2226.     Return:     none
  2227.     Also see:   msbreles msstatus
  2228.     Example:
  2229.                 int bstat,bcount,x,y;
  2230.                 ......
  2231.                 msbpres(0,&bstat,&bcount,&x,&y);
  2232.  
  2233.      
  2234.     Name:       msbreles
  2235.     Purpose:    gets info about specific button releases of mouse.
  2236.     Prototype:  void msbreles(int button,int *bstat,int *bcount,int *x,
  2237.                               int *y);
  2238.     Header:     cxlmou.h
  2239.     Inputs:     button  - button to check, 0 = left button, 1 = right button
  2240.                 bstat   - address to receive button status (0 = not being
  2241.                           pressed, 1 = currently being pressed)
  2242.                 bcount  - address to receive number of times released since
  2243.                           last call
  2244.                 x       - address to receive X pixel coordinate at time of
  2245.                           release
  2246.                 y       - address to receive Y pixel coordinate at time of
  2247.                           release
  2248.     Return:     none
  2249.     Also see:   msbpress msstatus
  2250.     Example:
  2251.                 int bstat,bcount,x,y;
  2252.                 ......
  2253.                 msbreles(0,&bstat,&bcount,&x,&y);
  2254.  
  2255.      
  2256.     Name:       mscursor
  2257.     Purpose:    sets the mouse cursor mode.
  2258.     Prototype:  void mscursor(int curtype,int smask,int cmask);
  2259.     Header:     cxlmou.h
  2260.     Inputs:     curtype     - cursor type, 0 = software, 1 = hardware
  2261.                 smask       - screen mask (SW) or start scan line (HW), see
  2262.                               section on using mouse functions for a
  2263.                               description of mask
  2264.                 cmask       - cursor mask (SW) or stop scan line (HW), see
  2265.                               section on using mouse functions for a
  2266.                               description of mask
  2267.     Return:     none
  2268.     Also see:   msshowcur
  2269.     Example:
  2270.                 mscursor(1,7,1);
  2271.  
  2272.      
  2273.     Name:       msgotoxy
  2274.     Purpose:    sets the mouse coordinates.
  2275.     Prototype:  void msgotoxy(int x,int y);
  2276.     Header:     cxlmou.h
  2277.     Inputs:     x   -   X pixel coordinate
  2278.  
  2279.  
  2280.                                       38   
  2281.                 y   -   Y pixel coordinate
  2282.     Return:     none
  2283.     Also see:   msstatus
  2284.     Example:
  2285.                 msgotoxy(20*8,10*8);  /* sets mouse cursor at row 10,
  2286.                                          column 20                    */
  2287.      
  2288.      
  2289.     Name:       mshbounds
  2290.     Purpose:    sets the mouse horizontal bounds.
  2291.     Prototype:  void mshbounds(int left,int right);
  2292.     Header:     cxlmou.h
  2293.     Inputs:     left    - left pixel boundary
  2294.                 right   - right pixel boundary
  2295.     Return:     none
  2296.     Also see:   msvbounds
  2297.     Example:
  2298.                   /* limits mouse movement between columns 40 and 60 */
  2299.                 mshbounds(40*8,60*8);
  2300.      
  2301.      
  2302.     Name:       mshidecur
  2303.     Purpose:    hides the mouse cursor.
  2304.     Prototype:  void mshidecur(void);
  2305.     Header:     cxlmou.h
  2306.     Inputs:     none
  2307.     Return:     none
  2308.     Also see:   msshowcur
  2309.     Example:
  2310.                 mshidecur();
  2311.      
  2312.      
  2313.     Name:       msinit
  2314.     Purpose:    determines if mouse is present.  If so, initializes mouse
  2315.                 and sets the global variable _mouse to a non-zero value.
  2316.                 See the "Mouse Functions" section for complete details.
  2317.     Prototype:  int msinit(void);
  2318.     Header:     cxlmou.h
  2319.     Inputs:     none
  2320.     Return:     a 0 if mouse is not present
  2321.     Example:
  2322.                 if(msinit()) {
  2323.                     printf("Mouse initialized!\n");
  2324.                 }
  2325.                 else {
  2326.                     printf("Mouse does not exist\n");
  2327.                 }
  2328.  
  2329.      
  2330.     Name:       msmotion
  2331.     Purpose:    gets information about the movement of mouse.
  2332.     Prototype:  void msmotion(int *xcount,int *ycount);
  2333.     Header:     cxlmou.h
  2334.     Inputs:     xcount   - address to receive amount of X movement in pixels
  2335.                 ycount   - address to receive amount of Y movement in pixels
  2336.     Return:     none
  2337.     Example:
  2338.  
  2339.  
  2340.                                       39   
  2341.                 int xcount,ycount;
  2342.                 ......
  2343.                 msmotion(&xcount,&ycount);
  2344.  
  2345.      
  2346.     Name:       msshowcur
  2347.     Purpose:    reveals the mouse cursor.
  2348.     Prototype:  void msshowcur(void);
  2349.     Header:     cxlmou.h
  2350.     Inputs:     none
  2351.     Return:     none
  2352.     Also see:   mshidecur
  2353.     Example:
  2354.                 msshowcur();
  2355.  
  2356.      
  2357.     Name:       msspeed
  2358.     Purpose:    adjusts mouse speed by changing its sensitivity.
  2359.     Prototype:  void msspeed(int xratio,int yratio);
  2360.     Header:     cxlmou.h
  2361.     Inputs:     xratio      - horizontal speed (higher numbers are slower)
  2362.                 yratio      - vertical speed (higher numbers are slower)
  2363.     Return:     none
  2364.     Example:
  2365.                 msspeed(15,15);
  2366.  
  2367.      
  2368.     Name:       msstatus
  2369.     Purpose:    returns the mouse status.
  2370.     Prototype:  void msstatus(int *bstat,int *x,int *y);
  2371.     Header:     cxlmou.h
  2372.     Inputs:     bstat   - address to receive button status (0 = not pressed,
  2373.                           1 = pressed)
  2374.                 x       - address to receive current X pixel coordinate
  2375.                 y       - address to receive current Y pixel coordinate
  2376.     Return:     none
  2377.     Example:
  2378.                 int bstat,x,y;
  2379.                 ......
  2380.                 msstatus(&bstat,&x,&y);
  2381.      
  2382.      
  2383.     Name:       msvbounds
  2384.     Purpose:    sets the mouse vertical bounds.
  2385.     Prototype:  void msvbounds(int top,int bottom);
  2386.     Header:     cxlmou.h
  2387.     Inputs:     top     - top pixel boundary
  2388.                 bottom  - bottom pixel boundary
  2389.     Return:     none
  2390.     Also see:   mshbounds
  2391.     Example:
  2392.                 /*  limits mouse movement between rows 10 and 20  */
  2393.                 msvbounds(10*8,20*8);
  2394.      
  2395.      
  2396.     Name:       numflop
  2397.     Purpose:    returns the number of floppy disk drives installed.
  2398.  
  2399.  
  2400.                                       40   
  2401.     Prototype:  int numflop(void);
  2402.     Header:     cxldef.h
  2403.     Inputs:     none
  2404.     Return:     the number of floppy disk drives installed
  2405.     Also see:   gameport mathchip numpar numser
  2406.     Example:
  2407.                 printf("Number of floppy disk drives = %d\n",
  2408.                     numflop());
  2409.      
  2410.       
  2411.     Name:       numoff
  2412.     Purpose:    toggles the NumLock key off.
  2413.     Prototype:  void numoff(void);
  2414.     Header:     cxlkey.h
  2415.     Inputs:     none
  2416.     Return:     none
  2417.     Also see:   capsoff kbstat numon
  2418.     Example:
  2419.                 numoff();
  2420.      
  2421.       
  2422.     Name:       numon
  2423.     Purpose:    toggles the NumLock key on.
  2424.     Prototype:  void numon(void);
  2425.     Header:     cxlkey.h
  2426.     Inputs:     none
  2427.     Return:     none
  2428.     Also see:   capson kbstat numoff
  2429.     Example:
  2430.                 numon();
  2431.  
  2432.       
  2433.     Name:       numpar
  2434.     Purpose:    determines the number of parallel ports.
  2435.     Prototype:  int numpar(void);
  2436.     Header:     cxldef.h
  2437.     Inputs:     none
  2438.     Return:     the number of parallel ports installed
  2439.     Also see:   gameport mathchip numflop numser
  2440.     Example:
  2441.                 printf("Number of parallel ports = %d\n",
  2442.                     numpar());
  2443.      
  2444.       
  2445.     Name:       numser
  2446.     Purpose:    determines the number of serial ports installed.
  2447.     Prototype:  int numser(void);
  2448.     Header:     cxldef.h
  2449.     Inputs:     none
  2450.     Return:     the number of serial ports installed
  2451.     Also see:   gameport mathchip numflop numpar
  2452.     Example:
  2453.                 printf("Number of serial ports = %d\n",
  2454.                     numser());
  2455.      
  2456.       
  2457.     Name:       printc
  2458.  
  2459.  
  2460.                                       41   
  2461.     Purpose:    prints a character to the screen at a specified location and
  2462.                 attribute.
  2463.     Prototype:  void printc(int row,int col,int attr,int ch,int count);
  2464.     Header:     cxlvid.h
  2465.     Inputs:     row     - row
  2466.                 col     - column
  2467.                 attr    - attribute of character
  2468.                 ch      - character to print
  2469.                 count   - number of times to print character
  2470.     Return:     none
  2471.     Also see:   attrib printcd
  2472.     Example:
  2473.                 printc(18,60,LGREEN|BLINK,'Z',5);
  2474.      
  2475.       
  2476.     Name:       printcd
  2477.     Purpose:    prints a character directly to the screen at a specified
  2478.                 location and attribute (no BIOS calls).
  2479.     Prototype:  void printcd(int row,int col,int attr,int ch);
  2480.     Header:     cxlvid.h
  2481.     Inputs:     row     - row
  2482.                 col     - column
  2483.                 attr    - attribute of character
  2484.                 ch      - character to print
  2485.     Return:     none
  2486.     Also see:   attrib printc videoinit
  2487.     Example:
  2488.                 printcd(18,60,LGREEN|BLINK,'Z');
  2489.      
  2490.      
  2491.     Name:       prints
  2492.     Purpose:    displays a string on the screen at a specified location
  2493.                 and attribute.
  2494.     Prototype:  void prints(int row,int col,int attr,char *str);
  2495.     Header:     cxlvid.h
  2496.     Inputs:     row     - cursor row
  2497.                 col     - cursor column
  2498.                 attr    - character attribute
  2499.                 str     - address of string to display
  2500.     Return:     none
  2501.     Also see:   attrib printsd
  2502.     Example:
  2503.                 prints(20,10,LRED|_LGREY,"Hello, world");
  2504.  
  2505.       
  2506.     Name:       printsd
  2507.     Purpose:    displays a string at a specified location in a specified
  2508.                 attribute directly on the screen (no BIOS calls).
  2509.     Prototype:  void printsd(int row,int col,int attr,char *str);
  2510.     Header:     cxlvid.h
  2511.     Inputs:     row     - cursor row
  2512.                 col     - cursor column
  2513.                 attr    - character attribute
  2514.                 str     - address of string to display
  2515.     Return:     none
  2516.     Also see:   attrib prints videoinit
  2517.     Example:
  2518.  
  2519.  
  2520.                                       42   
  2521.                 printsd(20,10,LRED|_LGREY,"Hello, world");
  2522.      
  2523.       
  2524.     Name:       readchat
  2525.     Purpose:    reads the character and attribute under the cursor.
  2526.     Prototype:  int readchat(void);
  2527.     Header:     cxlvid.h
  2528.     Inputs:     none
  2529.     Return:     integer containing character in low byte and attribute in
  2530.                 high byte
  2531.     Also see:   revattr setattr
  2532.     Example:
  2533.                 int i;
  2534.                 ......
  2535.                 i=readchat();
  2536.                 printf("character is %c and attribute is %d\n",i,(i>>8));
  2537.      
  2538.      
  2539.     Name:       readcur
  2540.     Purpose:    reads the current cursor location.
  2541.     Prototype:  void readcur(int *row,int *col);
  2542.     Header:     cxlvid.h
  2543.     Inputs:     row     - address of location to receive cursor row
  2544.                 col     - address of location to receive cursor column
  2545.     Return:     none
  2546.     Also see:   gotoxy_
  2547.     Example:
  2548.                 int row,col;
  2549.                 ......
  2550.                 readcur(&row,&col);
  2551.      
  2552.       
  2553.     Name:       revattr
  2554.     Purpose:    reverses the attribute of the character under the current
  2555.                 cursor location, continues for the specified number of
  2556.                 characters.
  2557.     Prototype:  void revattr(int count);
  2558.     Header:     cxlvid.h
  2559.     Inputs:     count   - the number of characters to reverse attribute of
  2560.     Return:     none
  2561.     Also see:   readchat setattr
  2562.     Example:
  2563.                 revattr(5);
  2564.      
  2565.      
  2566.     Name:       scrndump
  2567.     Purpose:    dumps the current screen to the printer.
  2568.     Prototype:  void scrndump(void);
  2569.     Header:     cxlprn.h
  2570.     Inputs:     none
  2571.     Return:     none
  2572.     Also see:   scrntodisk ssave videoinit
  2573.     Example:
  2574.                 scrndump();
  2575.      
  2576.      
  2577.     Name:       scrntodisk
  2578.  
  2579.  
  2580.                                       43   
  2581.     Purpose:    copies the current screen to a disk file.
  2582.     Prototype:  int scrntodisk(char *fname);
  2583.     Header:     cxlvid.h
  2584.     Inputs:     fname   - address of the string containing file to write to
  2585.     Return:     a zero if no error
  2586.     Also see:   disktoscrn scrndump ssave wintodisk
  2587.     Example:
  2588.                 if(scrntodisk("SCREEN.DAT")) {
  2589.                     printf("Error creating file\n");
  2590.                     exit(1);
  2591.                 }
  2592.      
  2593.      
  2594.     Name:       setattr
  2595.     Purpose:    sets the attribute of the character under the current cursor
  2596.                 location, continues for the specified number of characters.
  2597.     Prototype:  void setattr(int attr,int count);
  2598.     Header:     cxlvid.h
  2599.     Inputs:     attr    - attribute to set character
  2600.                 count   - the number of characters to set the attribute of
  2601.     Return:     none
  2602.     Also see:   attrib readchat revattr
  2603.     Example:
  2604.                 setattr(LRED|BLINK,5);
  2605.      
  2606.  
  2607.     Name:       setcursz
  2608.     Purpose:    sets the cursor size.
  2609.     Prototype:  void setcursz(int sline,int eline);
  2610.     Header:     cxlvid.h
  2611.     Inputs:     sline   - start line of cursor (32 for no cursor)
  2612.                 eline   - end line of cursor
  2613.     Return:     none
  2614.     Example:
  2615.                 setcursz(1,7);      /* makes a large cursor */
  2616.      
  2617.       
  2618.     Name:       setkbloop
  2619.     Purpose:    sets a procedure that will be called while waiting for
  2620.                 a keypress.
  2621.     Prototype:  void setkbloop( void (*func) (void));
  2622.     Header:     cxlkey.h
  2623.     Inputs:     func    - address of the procedure to be called while
  2624.                           waiting for keypress or NULL to cancel the
  2625.                           procedure.
  2626.     Return:     none
  2627.     Also see:   waitkey waitkeyt
  2628.     Example:
  2629.                 setkbloop(myfunc);
  2630.  
  2631.  
  2632.     Name:       setlines
  2633.     Purpose:    sets the number of lines on the display.
  2634.     Prototype:  int setlines(int numlines);
  2635.     Header:     cxlvid.h
  2636.     Inputs:     numlines    - the number of lines to set the display to,
  2637.                               valid numbers are 25 for all video adapters,
  2638.  
  2639.  
  2640.                                       44   
  2641.                               43 for EGA, and 50 for VGA.
  2642.      Return:     zero if no error
  2643.      Also see:   mode vidtype
  2644.      Example:
  2645.                  if(setlines(43)) {
  2646.                      printf("You need an EGA monitor for 43-line mode\n");
  2647.                  }
  2648.                  else {
  2649.                      printf("You are now in EGA 43-line mode\n");
  2650.                  }
  2651.      
  2652.      
  2653.     Name:       setonkey
  2654.     Purpose:    attaches/detaches a keypress to a function call.  Works by
  2655.                 intercepting any calls to CXL keyboard input functions.
  2656.                 Whenever you use one of CXL's keyboard input functions, the
  2657.                 input function will check to see if the pressed key has been
  2658.                 defined.  If so, then the input function will call the
  2659.                 corresponding function.  If not, then the input function
  2660.                 will pass on the keypress as normal.  This function can be
  2661.                 used for simple context sensitive help by defining the help
  2662.                 key for one procedure and redefining for the next.
  2663.     Prototype:  int setonkey(unsigned keycode,void (*func) (void),int pass);
  2664.     Header:     cxlkey.h
  2665.     Inputs:     keycode - scan code/ASCII code of the keypress to define. If
  2666.                           the keycode was previous defined, it will be
  2667.                           re-defined.  The scan code must be in the upper 8
  2668.                           bits and the ASCII code must be in the lower 8
  2669.                           bits.  This is easily accomplished using a scan
  2670.                           code/ASCII code reference table and using the hex
  2671.                           values for both codes.  For example, the Escape
  2672.                           key has a scan code of 0x01 and an ASCII code of
  2673.                           0x1b, so the value you would input for keycode
  2674.                           would be 0x011b.
  2675.                 func    - address of the function to call upon keypress.
  2676.                           The called function must have the prototype:
  2677.                                 void func(void);
  2678.                           If NULL is specified for func, then the specified
  2679.                           keycode will be un-defined.
  2680.                 pass    - pass the keypress on to the caller?  0=no, 1=yes
  2681.                           After the function corresponding to the defined
  2682.                           keypress has been called, the keyboard input
  2683.                           function can pass on the keypress to its caller or
  2684.                           it can wait for another keypress.
  2685.     Return:     a zero if no error, otherwise a memory allocation error
  2686.     Example:
  2687.                                     /*  attaches Ctrl-T to myfunc()  */
  2688.                 setonkey(0x1414,myfunc,0);  
  2689.  
  2690.  
  2691.     Name:       sound_
  2692.     Purpose:    sounds a tone of specified pitch and duration.
  2693.     Prototype:  void sound_(unsigned pitch,unsigned duration);
  2694.     Header:     cxldef.h
  2695.     Inputs:     pitch       - pitch of tone (0-65535)
  2696.                 duration    - duration of tone (0-65535) ie. 18 = 1 second
  2697.     Return:     none
  2698.  
  2699.  
  2700.                                       45   
  2701.     Also see:   beep
  2702.     Example:
  2703.                 sound_(255,3);
  2704.       
  2705.      
  2706.     Name:       spc
  2707.     Purpose:    displays a specified number of spaces to the screen.
  2708.     Prototype:  void spc(int num);
  2709.     Header:     cxlvid.h
  2710.     Inputs:     num     - number of spaces to display
  2711.     Return:     none
  2712.     Example:
  2713.                 spc(3);
  2714.      
  2715.      
  2716.     Name:       srestore
  2717.     Purpose:    restores a previously saved screen.
  2718.     Prototype:  void srestore(int *sbuf);
  2719.     Header:     cxlvid.h
  2720.     Inputs:     sbuf    - address of previously saved screen buffer
  2721.     Return:     none
  2722.     Also see:   ssave videoinit wrestore
  2723.     Example:
  2724.                 srestore(sbuf);
  2725.      
  2726.       
  2727.     Name:       ssave
  2728.     Purpose:    saves the current screen to a buffer.
  2729.     Prototype:  int *ssave(void);
  2730.     Header:     cxlvid.h
  2731.     Inputs:     none
  2732.     Return:     address of newly created screen buffer or 0 if allocation
  2733.                 error
  2734.     Also see:   scrndump scrntodisk srestore videoinit wsave
  2735.     Example:
  2736.                 int *sbuf;
  2737.                 ......
  2738.                 sbuf=ssave();
  2739.                 if(!sbuf) {
  2740.                     printf("Memory allocation error\n");
  2741.                     exit(1);
  2742.                 }
  2743.      
  2744.       
  2745.     Name:       strblank
  2746.     Purpose:    determines if a given string is blank (whitespace)
  2747.     Prototype:  int strblank(char *str);
  2748.     Header:     cxlstr.h
  2749.     Inputs:     str   - address of the string to check
  2750.     Return:     a 0 if not blank, a 1 if blank
  2751.     Example:
  2752.                 char *str="    ";
  2753.                 printf("str is %sblank\n",strblank(str)?"":"not ");
  2754.  
  2755.  
  2756.     Name:       strbmatch
  2757.     Purpose:    returns the best match of a string in an array of strings.
  2758.  
  2759.  
  2760.                                       46   
  2761.     Prototype:  char *strbmatch(char *str,char *strarr[]);
  2762.     Header:     cxlstr.h
  2763.     Inputs:     str     - address of string to match
  2764.                 strarr  - address of array of string pointers, the last
  2765.                           pointer in the array must be NULL
  2766.     Return:     address of the string in the array that best matched the
  2767.                 given string.
  2768.     Also see:   strmatch
  2769.     Example:
  2770.                 char *strarr[]= { "Hello","Computer","World",NULL };
  2771.                 char *str="xhelpx";
  2772.                 printf("best match is:  %s\n",strbmatch(str,strarr));
  2773.  
  2774.      
  2775.     Name:       strchg
  2776.     Purpose:    finds all letters in a string matching one character and
  2777.                 replaces them with another.
  2778.     Prototype:  int strchg(char *str,int oldch,int newch);
  2779.     Header:     cxlstr.h
  2780.     Inputs:     str     - address of string to search
  2781.                 oldch   - character to search for
  2782.                 newch   - character to replace with
  2783.     Return:     the number of matches found
  2784.     Also see:   strichg
  2785.     Example:
  2786.                 char *str="Hello there";
  2787.                 printf("Before:  %s\n",str);
  2788.                 strchg(str,'h','*');
  2789.                 printf("After:  %s\n",str);
  2790.      
  2791.       
  2792.     Name:       strcode
  2793.     Purpose:    encodes/decodes a string.  Call this function to encode a
  2794.                 string, then call again using the same key to decode.  When
  2795.                 reading or writing from a disk file, be sure to open the
  2796.                 file in binary mode.
  2797.     Prototype:  char *strcode(char *str,char *key);
  2798.     Header:     cxlstr.h
  2799.     Inputs:     str  - the address of the string to encode/decode
  2800.                 key  - the address of the key string to encode/decode with.
  2801.                        The string can consist of any valid characters
  2802.                        (1-255) and can be of any length.  Remember this key
  2803.                        or your data will be lost forever!
  2804.     Return:     the address of the encoded/decoded string
  2805.     Example:
  2806.                 char *str="Hello, world";
  2807.                 printf("Before:   %s\n",str);
  2808.                 strcode(str,"m{&!\xfc");
  2809.                 printf("Encoded:  %s\n",str);
  2810.                 strcode(str,"m{&!\xfc");
  2811.                 printf("Decoded:  %s\n",str);
  2812.      
  2813.      
  2814.     Name:       strdel
  2815.     Purpose:    deletes a substring from within a string.
  2816.     Prototype:  char *strdel(char *substr,char *str);
  2817.     Header:     cxlstr.h
  2818.  
  2819.  
  2820.                                       47   
  2821.     Inputs:     substr  - address of substring to delete
  2822.                 str     - address of string to delete from
  2823.     Return:     a NULL if the substring was not found, or the address of the
  2824.                 modified string.
  2825.     Also see:   stridel strinc strins strmid
  2826.     Example:
  2827.                 char *str="Hello, XXXXXworld";
  2828.                 strdel("XXXXX",str);
  2829.                 printf("%s\n",str);
  2830.  
  2831.       
  2832.     Name:       strichg
  2833.     Purpose:    finds all letters in a string matching one character and
  2834.                 replaces them with another, ignoring case of letters.
  2835.     Prototype:  int strichg(char *str,int oldch,int newch);
  2836.     Header:     cxlstr.h
  2837.     Inputs:     str     - address of string to search
  2838.                 oldch   - character to search for
  2839.                 newch   - character to replace with
  2840.     Return:     the number of matches found
  2841.     Also see:   strchg
  2842.     Example:
  2843.                 char *str="Hello there";
  2844.                 printf("Before:  %s\n",str);
  2845.                 strichg(str,'h','*');
  2846.                 printf("After:  %s\n",str);
  2847.  
  2848.       
  2849.     Name:       stridel
  2850.     Purpose:    deletes a substring from within a string, ignoring case of
  2851.                 letters.
  2852.     Prototype:  char *stridel(char *substr,char *str);
  2853.     Header:     cxlstr.h
  2854.     Inputs:     substr  - address of substring to delete
  2855.                 str     - address of string to delete from
  2856.     Return:     a NULL if the substring was not found, or the address of the
  2857.                 modified string
  2858.     Also see:   strdel striinc
  2859.     Example:
  2860.                 char *str="Hello, XXXXXworld";
  2861.                 stridel("XXXXX",str);
  2862.                 printf("%s\n",str);
  2863.  
  2864.       
  2865.     Name:       striinc
  2866.     Purpose:    determines if one string is included in another, ignoring
  2867.                 case of letters.
  2868.     Prototype:  char *striinc(char *str1,char *str2);
  2869.     Header:     cxlstr.h
  2870.     Inputs:     str1    - address of string1
  2871.                 str2    - address of string2
  2872.     Return:     the address where string1 is included in string2, or a NULL
  2873.                 if string1 is not included in string2
  2874.     Also see:   strinc strmid
  2875.     Example:
  2876.                 char *str1="HeLlo WOrLd";
  2877.                 char *str2="XXXXXXXHello, worldXXXXX";
  2878.  
  2879.  
  2880.                                       48   
  2881.                 if(striinc(str1,str2)) {
  2882.                     printf("%s is included in %s\n",str1,str2);
  2883.                 }
  2884.      
  2885.  
  2886.     Name:       strinc
  2887.     Purpose:    determines if one string is included in another.
  2888.     Prototype:  char *strinc(char *str1,char *str2);
  2889.     Header:     cxlstr.h
  2890.     Inputs:     str1    - address of string1
  2891.                 str2    - address of string2
  2892.     Return:     the address where string1 is included in string2, or a NULL
  2893.                 if string1 is not included in string2
  2894.     Also see:   striinc strmid
  2895.     Example:
  2896.                 char *str1="Hello world";
  2897.                 char *str2="XXXXXXXHello, worldXXXXX";
  2898.                 if(strinc(str1,str2)) {
  2899.                     printf("%s is included in %s\n",str1,str2);
  2900.                 }
  2901.      
  2902.       
  2903.     Name:       strins
  2904.     Purpose:    inserts one string into another.
  2905.     Prototype:  char *strins(char *instr,char **str,int st_pos);
  2906.     Header:     cxlstr.h
  2907.     Inputs:     instr   - the address of the string to insert
  2908.                 str     - the address of the address of the string to
  2909.                           insert into
  2910.                 st_pos  - the starting position for where to insert
  2911.     Return:     the address of the newly allocated string, or a NULL if a
  2912.                 memory allocation error occurred
  2913.     Also see:   strdel strinc
  2914.     Example:
  2915.                 char *str="Hello!";
  2916.                 printf("%s\n",str);
  2917.                 strins(", world",&str,5);
  2918.                 printf("%s\n",str);
  2919.                 free(str);  /* free memory when done with string */
  2920.      
  2921.      
  2922.     Name:       striocc
  2923.     Purpose:    returns the number of occurrences of a character in a string
  2924.                 ignoring the case of letters.
  2925.     Prototype:  int striocc(char *str,int ch);
  2926.     Header:     cxlstr.h
  2927.     Inputs:     str     - address of the string to search
  2928.                 ch      - the character to look for
  2929.     Return:     the number of occurrences of the character in the string
  2930.     Also see:   strocc
  2931.     Example:
  2932.                 char ch='L';
  2933.                 char *str="Hello, world";
  2934.                 printf("%c occurs in %s %d times\n",ch,str,
  2935.                     striocc(str,ch));
  2936.      
  2937.       
  2938.  
  2939.  
  2940.                                       49   
  2941.     Name:       strleft
  2942.     Purpose:    takes a specified portion of a string from the left and
  2943.                 creates a new string.
  2944.     Prototype:  char *strleft(char *str,int num_chars);
  2945.     Header:     cxlstr.h
  2946.     Inputs:     str         - address of input string
  2947.                 num_chars   - number of characters to copy
  2948.     Return:     address of the newly created string or a NULL if a memory
  2949.                 allocation error occurred
  2950.     Also see:   strmid strright strtrim
  2951.     Example:
  2952.                 char *left;
  2953.                 char *str="Hello, worldXXXX";
  2954.                 left=strleft(str,12);
  2955.                 printf("%s\n",left);
  2956.                 free(left);  /* free memory when done with string */
  2957.  
  2958.  
  2959.     Name:       strltrim
  2960.     Purpose:    trims leading spaces off of a string.
  2961.     Prototype:  char *strtrim(char *str);
  2962.     Header:     cxlstr.h
  2963.     Inputs:     str  - address of the string to trim
  2964.     Return:     address of the modified string
  2965.     Also see:   strright strsetsz strtrim
  2966.     Example:
  2967.                 char *str="        Hello, world";
  2968.                 printf("Before:  %s.\n",str);
  2969.                 strltrim(str);
  2970.                 printf("After:   %s.\n",str);
  2971.  
  2972.  
  2973.     Name:       strmatch
  2974.     Purpose:    compares 2 strings, returns a match score.
  2975.     Prototype:  int strmatch(char *str1,char *str2);
  2976.     Header:     cxlstr.h
  2977.     Inputs:     str1    - address of first string
  2978.                 str2    - address of second string
  2979.     Return:     a match score, the higher the score, the better they match
  2980.     Also see:   strbmatch
  2981.     Example:
  2982.                 char *str1="hello";
  2983.                 char *str2="help";
  2984.                 printf("match score = %d\n",strmatch(str1,str2));
  2985.  
  2986.  
  2987.     Name:       strmid
  2988.     Purpose:    takes a section from input string starting at given position
  2989.                 and taking the given amount of characters creating a new
  2990.                 string.
  2991.     Prototype:  char *strmid(char *str,int st_pos,int num_chars);
  2992.     Header:     cxlstr.h
  2993.     Inputs:     str         - address of input string
  2994.                 st_pos      - position in input string to start copying
  2995.                               characters (starting at position 0)
  2996.                 num_chars   - number of characters to copy
  2997.     Return:     address of the newly created string or a NULL if a memory
  2998.  
  2999.  
  3000.                                       50   
  3001.                 allocation error occurred
  3002.     Also see:   strleft strright
  3003.     Example:
  3004.                 char *middle;
  3005.                 char *str="XXXXXHello, worldXXXX";
  3006.                 middle=strmid(str,5,12);
  3007.                 printf("%s\n",middle);
  3008.                 free(middle);   /* free memory when done with string */
  3009.  
  3010.  
  3011.     Name:       strocc
  3012.     Purpose:    returns the number of occurrences of a character in a
  3013.                 string.
  3014.     Prototype:  int strocc(char *str,int ch);
  3015.     Header:     cxlstr.h
  3016.     Inputs:     str     - address of the string to search
  3017.                 ch      - the character to look for
  3018.     Return:     the number of occurrences of the character in the string
  3019.     Also see:   striocc
  3020.     Example:
  3021.                 char ch='l';
  3022.                 char *str="Hello, world";
  3023.                 printf("%c occurs in %s %d times\n",ch,str,strocc(str,ch));
  3024.  
  3025.  
  3026.     Name:       strright
  3027.     Purpose:    takes a specifed portion from the right side of a string
  3028.                 creating a new string.
  3029.     Prototype:  char *strright(char *str,int num_chars);
  3030.     Header:     cxlstr.h
  3031.     Inputs:     str         - address of input string
  3032.                 num_chars   - number of characters to copy
  3033.     Return:     address of the newly created string or a NULL if a memory
  3034.                 allocation error occurred
  3035.     Also see:   strleft strltrim strmid
  3036.     Example:
  3037.                 char *right;
  3038.                 char *str="XXXXXHello, world";
  3039.                 right=strright(str,12);
  3040.                 printf("%s\n",right);
  3041.                 free(right);    /* free memory when done with string */
  3042.  
  3043.  
  3044.     Name:       strrol
  3045.     Purpose:    rotates a string specified number of characters left,
  3046.                 characters wrap around.
  3047.     Prototype:  char *strrol(char *str,int count);
  3048.     Header:     cxlstr.h
  3049.     Inputs:     str    - the address of the string to rotate
  3050.                 count  - number of characters to rotate
  3051.     Return:     the address of the modified string
  3052.     Also see:   strror strshl
  3053.     Example:
  3054.                 char *str="Hello, world";
  3055.                 printf("Before:  %s.\n",str);
  3056.                 strrol(str,3);
  3057.                 printf("After:   %s.\n",str);
  3058.  
  3059.  
  3060.                                       51   
  3061.  
  3062.  
  3063.     Name:       strror
  3064.     Purpose:    rotates a string specified number of characters right,
  3065.                 characters wrap around.
  3066.     Prototype:  char *strror(char *str,int count);
  3067.     Header:     cxlstr.h
  3068.     Inputs:     str    - the address of the string to rotate
  3069.                 count  - number of characters to rotate
  3070.     Return:     the address of the modified string
  3071.     Also see:   strrol strshr
  3072.     Example:
  3073.                 char *str="Hello, world";
  3074.                 printf("Before:  %s.\n",str);
  3075.                 strror(str,3);
  3076.                 printf("After:   %s.\n",str);
  3077.  
  3078.  
  3079.     Name:       strsetsz
  3080.     Purpose:    adjusts the length of a string by truncation or padding with
  3081.                 spaces.
  3082.     Prototype:  char *strsetsz(char **str,int newsize);
  3083.     Header:     cxlstr.h
  3084.     Inputs:     str     - address of pointer to the string
  3085.                 newsize - the new length of the string
  3086.     Return:     address of the new string or a NULL if a memory allocation
  3087.                 error occurred.
  3088.     Also see:   strtrim
  3089.     Example:
  3090.                 char *str="Hello, world";
  3091.                 strsetsz(&str,25);
  3092.                 printf("%s.\n",str);
  3093.                 strsetsz(&str,5);
  3094.                 printf("%s.\n",str);
  3095.  
  3096.  
  3097.     Name:       strshl
  3098.     Purpose:    shifts a string specified number of characters left,
  3099.                 characters 'drop off' and spaces are added to the string.
  3100.     Prototype:  char *strshl(char *str,int count);
  3101.     Header:     cxlstr.h
  3102.     Inputs:     str    - the address of the string to shift
  3103.                 count  - number of characters to shift
  3104.     Return:     the address of the modifed string
  3105.     Also see:   strrol strshr
  3106.     Example:
  3107.                 char *str="Hello, world";
  3108.                 printf("Before:  %s.\n",str);
  3109.                 strshl(str,3);
  3110.                 printf("After:   %s.\n",str);
  3111.  
  3112.  
  3113.     Name:       strshr
  3114.     Purpose:    shifts a string specified number of characters right,
  3115.                 characters 'drop off' and spaces are added to the string.
  3116.     Prototype:  char *strshr(char *str,int count);
  3117.     Header:     cxlstr.h
  3118.  
  3119.  
  3120.                                       52   
  3121.     Inputs:     str    - the address of the string to shift
  3122.                 count  - number of characters to shift
  3123.     Return:     the address of the modified string
  3124.     Also see:   strror strshl
  3125.     Example:
  3126.                 char *str="Hello, world";
  3127.                 printf("Before:  %s.\n",str);
  3128.                 strshr(str,3);
  3129.                 printf("After:   %s.\n",str);
  3130.  
  3131.  
  3132.     Name:       strtrim
  3133.     Purpose:    trims trailing spaces off of a string.
  3134.     Prototype:  char *strtrim(char *str);
  3135.     Header:     cxlstr.h
  3136.     Inputs:     str  - address of the string to trim
  3137.     Return:     address of the modified string
  3138.     Also see:   strleft strltrim strsetsz
  3139.     Example:
  3140.                 char *str="Hello, world          ";
  3141.                 printf("Before:  %s.\n",str);
  3142.                 strtrim(str);
  3143.                 printf("After:   %s.\n",str);
  3144.  
  3145.  
  3146.     Name:       struplow
  3147.     Purpose:    converts a string to mixed upper & lower case characters.
  3148.     Prototype:  char *struplow(char *str);
  3149.     Header:     cxlstr.h
  3150.     Inputs:     str   - the address of the string to convert
  3151.     Return:     the address of the modified string
  3152.     Also see:   touplow
  3153.     Example:
  3154.                 char *str="heLlO, wOrLd";
  3155.                 printf("Before:  %s.\n",str);
  3156.                 struplow(str);
  3157.                 printf("After:   %s.\n",str);
  3158.  
  3159.  
  3160.     Name:       sysdate
  3161.     Purpose:    returns a string containing the current system date.
  3162.     Prototype:  char *sysdate(int dtype);
  3163.     Header:     cxldef.h
  3164.     Inputs:     dtype   - date type code.  Can be one of the following:
  3165.                                Code     Example
  3166.                                ----     -------
  3167.                                 0       December 3, 1988
  3168.                                 1       3 Dec 88
  3169.                                 2       12-3-88
  3170.                                 3       12/3/88
  3171.                                 4       3/12/88
  3172.     Return:     the address of the static string containing the system date.
  3173.     Also see:   systime
  3174.     Example:
  3175.                 printf("The system date is:  %s\n",sysdate(0));
  3176.  
  3177.  
  3178.  
  3179.  
  3180.                                       53   
  3181.     Name:       systime
  3182.     Purpose:    returns a string containing the system time.
  3183.     Prototype:  char *systime(int ttype);
  3184.     Header:     cxldef.h
  3185.     Inputs:     ttype   - time type code.  Can be one of the following:
  3186.                                Code     Example
  3187.                                ----     -------
  3188.                                 0       16:30:57.89
  3189.                                 1       16:30:57
  3190.                                 2       4:30 PM
  3191.                                 3       4:30p
  3192.                                 4       4:30
  3193.     Return:     the address of the static string containing the system time.
  3194.     Also see:   sysdate
  3195.     Example:
  3196.                 printf("The current system time is:  %s\n",systime(2));
  3197.  
  3198.  
  3199.     Name:       tabstop
  3200.     Purpose:    calculates a tab stop from given column and tab width.
  3201.     Prototype:  int tabstop(int col,int tabwidth);
  3202.     Header:     cxldef.h
  3203.     Inputs:     col         - column
  3204.                 tabwidth    - tab width
  3205.     Return:     the next tab stop column
  3206.     Example:
  3207.                 printf("The next tab stop after column 5 is %d\n",
  3208.                     tabstop(5,8));
  3209.  
  3210.  
  3211.     Name:       timer
  3212.     Purpose:    returns the value of the BIOS timer.
  3213.     Prototype:  unsigned long timer(void);
  3214.     Header:     cxldef.h
  3215.     Inputs:     none
  3216.     Return:     current value of the BIOS timer
  3217.     Also see:   delay_
  3218.     Example:
  3219.                 printf("%lu\n",timer());
  3220.                 delay_(36);
  3221.                 printf("%lu\n",timer());
  3222.  
  3223.  
  3224.     Name:       touplow
  3225.     Purpose:    converts a character to upper or lower case depending on
  3226.                 previous character.
  3227.     Prototype:  int touplow(char *str,char *pos,int ch);
  3228.     Header:     cxlstr.h
  3229.     Inputs:     str     - address of string
  3230.                 pos     - current position in string
  3231.                 ch      - character to convert
  3232.     Return:     the converted character
  3233.     Also see:   struplow
  3234.     Example:
  3235.                 char *str="Hello, world";
  3236.                 printf("Before: %s\n",str);
  3237.                 *(str+7)=touplow(str,str+7,*(str+7));
  3238.  
  3239.  
  3240.                                       54   
  3241.                 printf("After:  %s\n",str);
  3242.  
  3243.  
  3244.     Name:       videoinit
  3245.     Purpose:    initializes CXL's video system.  By default all CXL
  3246.                 functions performing direct screen writes go to the CGA
  3247.                 video RAM segment at 0xb800.  If you want these functions to
  3248.                 work correctly with a monochrome video adapter or within a
  3249.                 DESQview window, you must call this function.  This function
  3250.                 sets the value of the global variable _videoseg.
  3251.     Prototype:  void videoinit(void);
  3252.     Header:     cxlvid.h  cxlwin.h
  3253.     Inputs:     none
  3254.     Return:     none
  3255.     Also see:   vidtype
  3256.     Example:
  3257.                 videoinit();
  3258.  
  3259.  
  3260.     Name:       vidtype
  3261.     Purpose:    determines the display adapter type.
  3262.     Prototype:  int vidtype(void);
  3263.     Header:     cxlvid.h
  3264.     Inputs:     none
  3265.     Return:     video adapter type.  Will be one of the following values:
  3266.                     MDA     - Monochrome Display Adapter
  3267.                     HGC     - Hercules Graphics Card
  3268.                     HGCPLUS - Hercules Graphics Card Plus
  3269.                     INCOLOR - Hercules InColor card
  3270.                     CGA     - Color Graphics Adapter
  3271.                     EGA     - Enhanced Graphics Adapter
  3272.                     VGA     - Video Graphics Array adapter
  3273.     Also see:   mode videoinit
  3274.     Example:
  3275.                 int vid_adapt;
  3276.                 vid_adapt=vidtype();
  3277.                 if(vid_adapt>HGCPLUS) {
  3278.                     printf("A color adapter is installed\n");
  3279.                 }
  3280.  
  3281.  
  3282.     Name:       wactiv
  3283.     Purpose:    activates a previously opened window.
  3284.     Prototype:  int wactiv(WINDOW whandle);
  3285.     Header:     cxlwin.h
  3286.     Inputs:     whandle     - the window handle returned from the wopen()
  3287.                               function
  3288.     Return:     W_NOERROR   - no error
  3289.                 W_NOTFOUND  - window handle not found
  3290.                 W_NOACTIVE  - no open windows
  3291.     Also see:   wisactiv wopen
  3292.     Example:
  3293.                 int window_handle;
  3294.                 ......
  3295.                 wactiv(window_handle);
  3296.  
  3297.  
  3298.  
  3299.  
  3300.                                       55   
  3301.     Name:       waitkey
  3302.     Purpose:    halts execution until a key is pressed, the keyboard buffer
  3303.                 is cleared first.
  3304.     Prototype:  int waitkey(void);
  3305.     Header:     cxlkey.h
  3306.     Inputs:     none
  3307.     Return:     the ASCII value of the key pressed
  3308.     Also see:   clearkeys getchf waitkeyt
  3309.     Example:
  3310.                 waitkey();
  3311.  
  3312.  
  3313.     Name:       waitkeyt
  3314.     Purpose:    halts execution until a key is pressed or the specified time
  3315.                 limit expires, the keyboard buffer is cleared first.
  3316.     Prototype:  int waitkeyt(int duration);
  3317.     Header:     cxlkey.h
  3318.     Inputs:     duration - length of time to wait for keypress (18 = 1 sec)
  3319.     Return:     the ASCII value of the key pressed or a -1 if time expired
  3320.     Also see:   clearkeys delay_ getchf waitkey
  3321.     Example:
  3322.                 waitkeyt(182);  /* wait for a max of 10 seconds */
  3323.  
  3324.  
  3325.     Name:       waitvret
  3326.     Purpose:    waits for vertical retrace on CGA adapters.  This is useful
  3327.                 for writing your own routines that access the screen memory
  3328.                 directly.  Calling this first will give you at least 512
  3329.                 bytes of snow-free direct screen memory access.  The faster
  3330.                 your machine is, the more bytes you can move during vertical
  3331.                 retrace.  Although setting CXL's _cgasnow variable to 1
  3332.                 reduces snow, it doesn't eliminate it.  You can use this
  3333.                 function for "problem sections" of your code.
  3334.     Prototype:  void waitvret(void);
  3335.     Header:     cxlvid.h
  3336.     Inputs:     none
  3337.     Return:     none
  3338.     Example:
  3339.                 if(_cgasnow) waitvret();
  3340.  
  3341.  
  3342.     Name:       wblocked
  3343.     Purpose:    determines if a window is being blocked by any other
  3344.                 windows.
  3345.     Prototype:  int wblocked(WINDOW whandle);
  3346.     Header:     cxlwin.h
  3347.     Inputs:     whandle   - handle of window to check
  3348.     Return:     -1    - error.  The global variable _werrno will be set to
  3349.                         one of the following:
  3350.                             W_NOACTIVE  - no active window
  3351.                             W_NOTFOUND  - window handle not found
  3352.                  0    - window is not blocked
  3353.                  1    - window is blocked
  3354.     Also see:   wisactiv
  3355.     Example:
  3356.                 WINDOW w1,w2;
  3357.                 w1=wopen(0,0,10,20,0,LCYAN|_BLUE,LCYAN|_BLUE);
  3358.  
  3359.  
  3360.                                       56   
  3361.                 w2=wopen(8,8,15,40,0,LMAGENTA|_RED,LMAGENTA|_RED);
  3362.                 wopen(5,45,15,75,0,YELLOW|_GREEN,YELLOW|_GREEN);
  3363.                 printf("the blue window is %sblocked\n",
  3364.                     wblocked(w1)?"":"not ");
  3365.                 printf("the red window is %sblocked\n",
  3366.                     wblocked(w2)?"":"not ");
  3367.  
  3368.  
  3369.     Name:       wborder
  3370.     Purpose:    changes the active window's border box type.
  3371.     Prototype:  int wborder(int btype);
  3372.     Header:     cxlwin.h
  3373.     Inputs:     btype   - box type (0-5).  Use btype 5 for a borderless
  3374.                           window.
  3375.     Return:     W_NOERROR   - no error
  3376.                 W_NOACTIVE  - no active window
  3377.                 W_INVBTYPE  - invalid box type
  3378.     Example:
  3379.                 wborder(1);
  3380.  
  3381.  
  3382.     Name:       wbox
  3383.     Purpose:    displays a text box in active window.
  3384.     Prototype:  int wbox(int wsrow,int wscol,int werow,int wecol,int btype,
  3385.                          int attr);
  3386.     Header:     cxlwin.h
  3387.     Inputs:     wsrow   - window start row
  3388.                 wscol   - window start column
  3389.                 werow   - window end row
  3390.                 wecol   - window end column
  3391.                 btype   - box type (0-5)
  3392.                 attr    - attribute
  3393.     Return:     W_NOERROR   - no error
  3394.                 W_NOACTIVE  - no active window
  3395.                 W_INVCOORD  - invalid coordinates
  3396.     Also see:   wfill whline wvline
  3397.     Example:
  3398.                 wbox(2,2,10,20,0,LMAGENTA|_RED);
  3399.  
  3400.  
  3401.     Name:       wcclear
  3402.     Purpose:    clears the currently active window using specified
  3403.                 attribute.
  3404.     Prototype:  int wcclear(int attr);
  3405.     Header:     cxlwin.h
  3406.     Inputs:     none
  3407.     Return:     W_NOERROR   - no error
  3408.                 W_NOACTIVE  - no active window
  3409.     Also see:   wclear wclreol wclreos
  3410.     Example:
  3411.                 wcclear(LBLUE|_RED);
  3412.  
  3413.  
  3414.     Name:       wcenters
  3415.     Purpose:    displays a string centered in active window.
  3416.     Prototype:  int wcenters(int wrow,int attr,char *str);
  3417.     Inputs:     wrow    - window row
  3418.  
  3419.  
  3420.                                       57   
  3421.                 attr    - attribute
  3422.                 str     - address of string to display
  3423.     Return:     W_NOERROR   - no error
  3424.                 W_NOACTIVE  - no active window
  3425.                 W_INVCOORD  - invalid window row
  3426.                 W_STRLONG   - string too long to be centered in window
  3427.     Also see:   wprints wrjusts
  3428.     Example:
  3429.                 wcenters(2,LBLUE,"Hello, world");
  3430.  
  3431.  
  3432.     Name:       wchgattr
  3433.     Purpose:    changes attribute of the active window, all text within the
  3434.                 window will be changed also.
  3435.     Prototype:  int wchgattr(int battr,int wattr);
  3436.     Header:     cxlwin.h
  3437.     Inputs:     battr   - the attribute to make the window's border
  3438.                 wattr   - the attribute to make the window
  3439.     Return:     W_NOERROR   - no error
  3440.                 W_NOACTIVE  - no active window
  3441.     Also see:   wtextattr
  3442.     Example:
  3443.                 wchgattr(LMAGENTA|_RED,YELLOW|_BLUE);
  3444.  
  3445.  
  3446.     Name:       wclear
  3447.     Purpose:    clears the currently active window.
  3448.     Prototype:  int wclear(void);
  3449.     Header:     cxlwin.h
  3450.     Inputs:     none
  3451.     Return:     W_NOERROR   - no error
  3452.                 W_NOACTIVE  - no active window
  3453.     Also see:   wcclear wclreol wclreos
  3454.     Example:
  3455.                 wclear();
  3456.  
  3457.  
  3458.     Name:       wclose
  3459.     Purpose:    closes the currently active window.
  3460.     Prototype:  int wclose(void);
  3461.     Header:     cxlwin.h
  3462.     Inputs:     none
  3463.     Return:     W_NOERROR   - no error
  3464.                 W_NOACTIVE  - no active window
  3465.     Also see:   wcloseall wopen
  3466.     Example:
  3467.                 wclose();
  3468.  
  3469.  
  3470.     Name:       wcloseall
  3471.     Purpose:    closes all open windows.
  3472.     Prototype:  int wcloseall(void);
  3473.     Header:     cxlwin.h
  3474.     Inputs:     none
  3475.     Return:     W_NOERROR   - no error
  3476.                 W_NOACTIVE  - no active window
  3477.     Also see:   wclose
  3478.  
  3479.  
  3480.                                       58   
  3481.     Example:
  3482.                 wcloseall();
  3483.  
  3484.  
  3485.     Name:       wclreol
  3486.     Purpose:    clears to the end of the active window's line.
  3487.     Prototype:  int wclreol(void);
  3488.     Header:     cxlwin.h
  3489.     Inputs:     none
  3490.     Return:     W_NOERROR   - no error
  3491.                 W_NOACTIVE  - no active window
  3492.     Also see:   wclear wclreos
  3493.     Example:
  3494.                 wclreol();
  3495.  
  3496.  
  3497.     Name:       wclreos
  3498.     Purpose:    clears from current cursor position to the end of
  3499.                 the active window.
  3500.     Prototype:  int wclreos(void);
  3501.     Header:     cxlwin.h
  3502.     Inputs:     none
  3503.     Return:     W_NOERROR   - no error
  3504.                 W_NOACTIVE  - no active window
  3505.     Also see:   wclear wclreol
  3506.     Example:
  3507.                 wclreos();
  3508.  
  3509.  
  3510.     Name:       wcopy
  3511.     Purpose:    creates a new window duplicating the active window, the new
  3512.                 window becomes the active window.
  3513.     Prototype:  WINDOW wcopy(int nsrow,int nscol);
  3514.     Header:     cxlwin.h
  3515.     Inputs:     nsrow   - start row of the duplicate window
  3516.                 nscol   - start column of the duplicate window
  3517.     Return:     the handle of the new window or a zero if an error occurred.
  3518.                 If error, the global variable _werrno will be set to one of
  3519.                 the following:  W_ALLOCERR  - memory allocation error
  3520.                                 W_INVCOORD  - invalid coordinates
  3521.     Also see:   wactiv wmove wopen
  3522.     Example:
  3523.                 wcopy(10,20);   /* make copy of active window at
  3524.                                    row 10, col 20                */
  3525.  
  3526.  
  3527.     Name:       wdelline
  3528.     Purpose:    deletes a line in active window
  3529.     Prototoype: int wdelline(int wrow,int direc);
  3530.     Header:     cxlwin.h
  3531.     Inputs:     wrow    - window row to delete
  3532.                 direc   - scroll direction:
  3533.                                 SUP    - scroll up
  3534.                                 SDOWN  - scroll down
  3535.     Return:     W_NOERROR   - no error
  3536.                 W_NOACTIVE  - no active window
  3537.                 W_INVCOORD  - invalid window row
  3538.  
  3539.  
  3540.                                       59   
  3541.     Also see:   winsline wscroll
  3542.     Example:
  3543.                 wdelline(4,SDOWN);
  3544.  
  3545.  
  3546.     Name:       wdupc
  3547.     Purpose:    displays a character specified number of times in active
  3548.                 window.  Characters will be displayed in the attribute set
  3549.                 by the wtextattr() function.  Control characters are
  3550.                 recognized.  Cursor position is updated.
  3551.     Prototype:  int wdupc(int ch,int count);
  3552.     Header:     cxlwin.h
  3553.     Inputs:     ch      - character to be displayed
  3554.                 count   - number of times to display character
  3555.     Return:     W_NOERROR   - no error
  3556.                 W_NOACTIVE  - no active window
  3557.     Also see:   wputc
  3558.     Example:
  3559.                 wdupc('X',5);       /* displays 'X' 5 times */
  3560.  
  3561.  
  3562.     Name:       werrmsg
  3563.     Purpose:    returns an error message from the last windowing function.
  3564.     Prototype:  char *werrmsg(void);
  3565.     Header:     cxlwin.h
  3566.     Inputs:     none
  3567.     Return:     the address of a static string containing an error message
  3568.                 corresponding to the error code from the last performed
  3569.                 windowing function.
  3570.     Also see:   wperror
  3571.     Example:
  3572.                 wgotoxy(255,255);       /* invalid coordinates */
  3573.                 printf("Error message = %s\n",werrmsg());
  3574.  
  3575.  
  3576.     Name:       wfill
  3577.     Purpose:    fills in a region of active window with specified character
  3578.                 and attribute.
  3579.     Prototype:  int wfill(int wsrow,int wscol,int werow,int wecol,int ch,
  3580.                           int attr);
  3581.     Header:     cxlwin.h
  3582.     Inputs:     wsrow   - window start row
  3583.                 wscol   - window start column
  3584.                 werow   - window end row
  3585.                 wecol   - window end column
  3586.                 ch      - character to fill with
  3587.                 attr    - attribute
  3588.     Return:     W_NOERROR   - no error
  3589.                 W_NOACTIVE  - no active window
  3590.                 W_INVCOORD  - invalid coordinates
  3591.     Also see:   wbox
  3592.     Example:
  3593.                 wfill(2,2,10,20,'Z',LMAGENTA|_RED);
  3594.  
  3595.  
  3596.     Name:       wfindrec
  3597.     Purpose:    finds the address of the window record of the specified
  3598.  
  3599.  
  3600.                                       60   
  3601.                 window handle.
  3602.     Prototype:  struct _wrec_t *wfindrec(WINDOW whandle);
  3603.     Header:     cxlwin.h
  3604.     Inputs:     whandle     - window handle of window record to find
  3605.     Return:     the address of the found window record or NULL if no record
  3606.                 was found for specified handle.
  3607.     Example:
  3608.                 struct _wrec_t *wrecptr;
  3609.                 ....
  3610.                 wrecptr=wfindrec(3);
  3611.  
  3612.  
  3613.     Name:       wgetc
  3614.     Purpose:    gets a character from the keyboard within the active window,
  3615.                 echos character pressed to the screen in the attribute set
  3616.                 by the wtextattr() function.
  3617.     Prototype:  int wgetc(void);
  3618.     Header:     cxlwin.h
  3619.     Inputs:     none
  3620.     Return:     the ASCII value of the key pressed or a zero if an error
  3621.                 occurred. If error, the global variable _werrno will be set
  3622.                 to one of the following:
  3623.                     W_NOACTIVE  - no active window
  3624.     Also see:   wgetchf wscanf wtextattr
  3625.     Example:
  3626.                 int ch;
  3627.                 ......
  3628.                 ch=wgetc();
  3629.  
  3630.  
  3631.     Name:       wgetchf
  3632.     Purpose:    gets a character from the keyboard within the active window,
  3633.                 allows only characters listed in the string of valid
  3634.                 characters.  Escape checking is provided by default.  This
  3635.                 can be turned off with the wsetesc() function.  Selected
  3636.                 character is echoed into the current window using the
  3637.                 attribute set by the wtextattr() function.
  3638.     Prototype:  int wgetchf(char *valid,int defchar);
  3639.     Header:     cxlwin.h
  3640.     Inputs:     valid   - address of the string containing the valid
  3641.                           characters
  3642.                 defchar - default selection in case Enter is pressed, or a
  3643.                           zero for no default
  3644.     Return:     the ASCII value of the key pressed or a zero if an error
  3645.                 occurred. If error, the global variable _werrno will be set
  3646.                 to one of the following:
  3647.                     W_NOACTIVE  - no active window
  3648.                     W_ESCPRESS  - Escape key was pressed
  3649.     Also see:   wgetc wscanf wtextattr
  3650.     Example:
  3651.                 int ch;
  3652.                 ......
  3653.                 ch=wgetchf("YyNn",'N');
  3654.                 if(_werrno==W_ESCPRESS) {
  3655.                     printf("Escape key was pressed\n");
  3656.                     exit(1);
  3657.                 }
  3658.  
  3659.  
  3660.                                       61   
  3661.  
  3662.  
  3663.     Name:       wgetns
  3664.     Purpose:    gets a string from the keyboard within active window, limits
  3665.                 the number of characters input to specified length.  Escape
  3666.                 checking is provided by default.  This can be turned off
  3667.                 with the wsetesc() function.  Entered characters will echo
  3668.                 to the active window in the attribute set by the wtextattr()
  3669.                 function.
  3670.     Prototype:  int wgetns(char *str,int maxlen);
  3671.     Header:     cxlwin.h
  3672.     Inputs:     str     - address of the allocated space to receive the
  3673.                           input string
  3674.                 maxlen  - the maximum length of the input string
  3675.     Return:     W_NOERROR   - no error
  3676.                 W_NOACTIVE  - no active window
  3677.                 W_ESCPRESS  - Escape key was pressed
  3678.     Also see:   wgets winputsf wscanf wsetesc wtextattr
  3679.     Example:
  3680.                 char fname[20];
  3681.                 ......
  3682.                 wputs("Enter your first name:  ");
  3683.                 wgetns(fname,5);
  3684.  
  3685.  
  3686.     Name:       wgets
  3687.     Purpose:    gets a string from the keyboard within active window, echos
  3688.                 the characters to the screen in the attribute set by the
  3689.                 wtextattr() function.
  3690.     Prototype:  int wgets(char *str);
  3691.     Header:     cxlwin.h
  3692.     Inputs:     str     - the address of the allocated memory to receive the
  3693.                           input string
  3694.     Return:     W_NOERROR   - no error
  3695.                 W_NOACTIVE  - no active window
  3696.     Also see:   wgetns winputsf wscanf wtextattr
  3697.     Example:
  3698.                 char fname[20];
  3699.                 ......
  3700.                 wputs("Enter your first name:  ");
  3701.                 wgets(fname);
  3702.  
  3703.  
  3704.     Name:       wgotoxy
  3705.     Purpose:    sets cursor coordinates within the currently active window.
  3706.     Prototype:  int wgotoxy(int wrow,int wcol);
  3707.     Header:     cxlwin.h
  3708.     Inputs:     wrow    - window row (Y coordinate)
  3709.                 wcol    - window column (X coordinate)
  3710.     Return:     W_NOERROR   - no error
  3711.                 W_NOACTIVE  - no active window
  3712.                 W_INVCOORD  - invalid coordinates
  3713.     Also see:   wpgotoxy wreadcur
  3714.     Example:
  3715.                 wgotoxy(2,3);   /* set cursor to row 2, column 3 */
  3716.  
  3717.  
  3718.  
  3719.  
  3720.                                       62   
  3721.     Name:       whandle
  3722.     Purpose:    returns the handle of the active window
  3723.     Prototype:  WINDOW whandle(void);
  3724.     Header:     cxlwin.h
  3725.     Inputs:     none
  3726.     Return:     the handle of the active window or zero if error.  If error,
  3727.                 the global variable _werrno will be set to one of the
  3728.                 following:  W_NOACTIVE  - no active window
  3729.     Also see:   wactiv wisactiv
  3730.     Example:
  3731.                 printf("active handle = %d\n",whandle());
  3732.  
  3733.  
  3734.     Name:       whide
  3735.     Purpose:    hides a previously saved window.
  3736.     Prototype:  int *whide(int **wbuf);
  3737.     Header:     cxlwin.h
  3738.     Inputs:     wbuf    - address of the pointer to the window buffer to
  3739.                           hide
  3740.     Return:     the address of the hidden window's buffer or a NULL if a
  3741.                 memory allocation error occurred.
  3742.     Also see:   wsave wunhide
  3743.     Example:
  3744.                                     /* hides active window */
  3745.                 if(!whide(_wrec->wbuf)) {
  3746.                     printf("Memory allocation error\n");
  3747.                     exit(1);
  3748.                 }
  3749.  
  3750.  
  3751.     Name:       whline
  3752.     Purpose:    draws a horizontal text line in active window using
  3753.                 characters defined by given box type.  If horizontal line
  3754.                 crosses a vertical line of the same box type, an appropriate
  3755.                 intersection or corner will be used.
  3756.     Prototype:  int whline(int wsrow,int wscol,int count,int btype);
  3757.     Header:     cxlwin.h
  3758.     Inputs:     wsrow   - window start row of line
  3759.                 wscol   - window start column of line
  3760.                 count   - number of line characters to display
  3761.                 btype   - box type (0-5)
  3762.     Return:     W_NOERROR   - no error
  3763.                 W_NOACTIVE  - no active window
  3764.                 W_INVCOORD  - text line too long for window
  3765.                 W_INVBTYPE  - invalid box type
  3766.     Also see:   wtextattr wvline
  3767.     Example:
  3768.                 whline(2,5,7,3);
  3769.  
  3770.  
  3771.     Name:       winpdef
  3772.     Purpose:    defines an area of the active window for keyboard input. See
  3773.                 the section "Multi-Field Formatted Input Functions" for the
  3774.                 complete details.
  3775.     Prototype:  int winpdef(int wrow,int wcol,char *str,char *format,
  3776.                             int fconv,int fattr,int update,
  3777.                             int (*validate) (char *));
  3778.  
  3779.  
  3780.                                       63   
  3781.     Header:     cxlwin.h
  3782.     Inputs:     wrow     - start of input, window's row coordinate
  3783.                 wcol     - start of input, window's column coordinate
  3784.                 str      - address of string buffer to receive input
  3785.                 format   - input field format string
  3786.                 fconv    - input field conversion character.  Applies
  3787.                            conversion to all letters in the input field. Can
  3788.                            be one of the following:
  3789.                                 0   - apply no conversion
  3790.                                 'L' - convert letters to lower case
  3791.                                 'M' - convert letters to mixed case
  3792.                                 'P' - password field (no echo)
  3793.                                 'U' - convert letters to upper case
  3794.                 fattr    - field attribute
  3795.                 update   - update pre-existing field?  0 = no, 1 = yes
  3796.                 validate - address of your user validation/modification
  3797.                            function.  The function must be declared like:
  3798.                                     int func(char *str);
  3799.                            Your user function will receive the field input
  3800.                            from the keyboard and will return zero if no
  3801.                            error.  If there was an error, then your function
  3802.                            will return the position of the error in the
  3803.                            string (starting at 1, not 0).  If you do not
  3804.                            wish to validate the field, then input NULL.
  3805.     Return:     W_NOERROR   - no error
  3806.                 W_ALLOCERR  - memory allocation error
  3807.                 W_NOACTIVE  - no active window
  3808.                 W_INVCOORD  - invalid coordinates
  3809.                 W_INVFORMT  - invalid format string
  3810.                 W_LENFORMT  - length of format string is invalid
  3811.     Also see:   winpread winputsf wscanf
  3812.     Example:
  3813.                 char name[11];
  3814.                 ......
  3815.                 wputs("Enter name:");
  3816.                 winpdef(1,13,name,"MMMMMMMMMM",0,LCYAN|_BLUE,0,NULL);
  3817.  
  3818.  
  3819.     Name:       winpread
  3820.     Purpose:    processes keyboard input of all defined areas of active
  3821.                 window allowing editing back and forth between defined
  3822.                 fields.  See the section "Multi-Field Formatted Input
  3823.                 Functions" for the complete details.
  3824.     Prototype:  int winpread(void);
  3825.     Header:     cxlwin.h
  3826.     Inputs:     none
  3827.     Return:     W_NOERROR   - no error
  3828.                 W_NOACTIVE  - no active window
  3829.                 W_ESCPRESS  - Escape key was pressed
  3830.                 W_NOINPDEF  - no inputs defined
  3831.     Also see:   winpdef wsetesc wtextattr
  3832.     Example:
  3833.                 winpread();
  3834.  
  3835.  
  3836.     Name:       winputsf
  3837.     Purpose:    inputs a formatted string from the keyboard within a window.
  3838.  
  3839.  
  3840.                                       64   
  3841.                 Input characters will be echoed to the active window in the
  3842.                 attribute set by the wtextattr() function.
  3843.     Prototype:  int winputsf(char *str,char *fmt);
  3844.     Header:     cxlwin.h
  3845.     Inputs:     str     - address of the allocated space to receive string
  3846.                 fmt     - address of the format string, see section on using
  3847.                           format strings for a complete description.
  3848.     Return:     W_NOERROR   - no error
  3849.                 W_NOACTIVE  - no active window
  3850.                 W_ESCPRESS  - Escape key was pressed
  3851.                 W_INVFORMT  - invalid format string
  3852.     Also see:   wgetns wgets winpdef wscanf wsetesc wtextattr
  3853.     Example:
  3854.                 winputsf(str," !RE! 'Enter phone number:  (' ### "
  3855.                              " ') ' ### '-' #### ");
  3856.  
  3857.  
  3858.     Name:       winsline
  3859.     Purpose:    inserts a blank line in active window
  3860.     Prototoype: int winsline(int wrow,int direc);
  3861.     Header:     cxlwin.h
  3862.     Inputs:     wrow    - window row to insert at
  3863.                 direc   - scroll direction:
  3864.                                 SUP    - scroll up
  3865.                                 SDOWN  - scroll down
  3866.     Return:     W_NOERROR   - no error
  3867.                 W_NOACTIVE  - no active window
  3868.                 W_INVCOORD  - invalid window row
  3869.     Also see:   wdelline wscroll
  3870.     Example:
  3871.                 winsline(3,SUP);
  3872.  
  3873.  
  3874.     Name:       wintodisk
  3875.     Purpose:    copies a screen window to a disk file.
  3876.     Prototype:  int wintodisk(int srow,int scol,int erow,int ecol,
  3877.                               char *fname);
  3878.     Header:     cxlwin.h
  3879.     Inputs:     srow    - starting row
  3880.                 scol    - starting column
  3881.                 erow    - ending row
  3882.                 ecol    - ending column
  3883.                 fname   - address of the string containing file to write to
  3884.     Return:     a zero if no error
  3885.     Also see:   disktowin scrntodisk wsave
  3886.     Example:
  3887.                 if(wintodisk(10,10,20,20,"WINDOW.DAT")) {
  3888.                     printf("Error creating file\n");
  3889.                     exit(1);
  3890.                 }
  3891.  
  3892.  
  3893.     Name:       wisactiv
  3894.     Purpose:    determines if specified window handle is active.
  3895.     Prototype:  int wisactiv(WINDOW whandle);
  3896.     Header:     cxlwin.h
  3897.     Inputs:     whandle - the handle of the window to check.
  3898.  
  3899.  
  3900.                                       65   
  3901.     Return:     a zero if handle is not active, a 1 if it is active.
  3902.     Also see:   wactiv wblocked whandle
  3903.     Example:
  3904.                 printf("handle 5 is %sactive\n",wisactiv(5)?"":"not ");
  3905.  
  3906.  
  3907.     Name:       wmenudef
  3908.     Purpose:    defines a window bar-selection menu option.  See the
  3909.                 "Bar-Selection Menu Functions" section for complete details.
  3910.     Prototype:  int wmenudef(int wrow,int wcol,int attr,char *str,
  3911.                              int tagchar,int tagattr,char *desc);
  3912.     Header:     cxlwin.h
  3913.     Inputs:     wrow    - window row to display option at
  3914.                 wcol    - window column to display option at
  3915.                 attr    - attribute to display option with
  3916.                 str     - address of the option string
  3917.                 tagchar - tag character to use for identification, may be
  3918.                           an ASCII value (0-255), lower case letters will
  3919.                           automatically be converted to upper case.
  3920.                 tagattr - attribute of tag character
  3921.                 desc    - address of a string describing the menu option or
  3922.                           a NULL if no description is to be used.  If not
  3923.                           NULL, then the text description of the option will
  3924.                           appear on the next line down and will change with
  3925.                           each menu option, similar to the menus in many
  3926.                           popular spreadsheet packages.  The text
  3927.                           description will be displayed in the window's
  3928.                           current text attribute which can be set with the
  3929.                           wtextattr() function.  Thus, desc should be NULL
  3930.                           unless using horizontal menus.
  3931.     Return:     W_NOERROR   - no error
  3932.                 W_ALLOCERR  - memory allocation error
  3933.                 W_NOACTIVE  - no active window
  3934.     Also see:   wmenuget
  3935.     Example:
  3936.                 if(wmenudef(2,3,LCYAN|_BLUE,"Add record",'A',
  3937.                     WHITE|_BLUE,NULL)) {
  3938.                     printf("Error:  %s\n",werrmsg());
  3939.                     exit(1);
  3940.                 }
  3941.  
  3942.  
  3943.     Name:       wmenuget
  3944.     Purpose:    gets a window bar-selection menu selection from the
  3945.                 keyboard.  See the "Bar-Selection Menu Functions" section
  3946.                 for complete details.
  3947.     Prototype:  int wmenuget(int barattr,int taginit,int pulldown);
  3948.     Header:     cxlwin.h
  3949.     Inputs:     barattr   - the attribute to use for the selection bar
  3950.                 taginit   - tag character of initial selection bar position.
  3951.                             If an invalid tag character is specified, the
  3952.                             position defaults to the upper left.
  3953.                 pulldown  - this specifies how the defined bar-selection
  3954.                             menu will act.  It can be one of the following
  3955.                             values:
  3956.                                 0       - not part of a pull-down menu
  3957.                                           system
  3958.  
  3959.  
  3960.                                       66   
  3961.                                 PDMAIN  - main menu of a pull-down menu
  3962.                                           system
  3963.                                 PDPREV  - main menu, automatically select
  3964.                                           the previous pull-down menu
  3965.                                 PDNEXT  - main menu, automatically select
  3966.                                           the next pull-down menu
  3967.                                 PDMENU  - pull-down menu
  3968.     Return:     the tag character of the selected option or zero if an
  3969.                 error.  If error, the global variable _werrno will be set to
  3970.                 one of the following:
  3971.                             W_ESCPRESS  - Escape key was pressed
  3972.                 If PDMENU is specified for the pulldown parameter, then
  3973.                 wmenuget() will return PDPREV if LeftArrow is pressed,
  3974.                 PDNEXT if the RightArrow is pressed, or PDMENU if Esc is
  3975.                 pressed.
  3976.     Also see:   wmenudef wsetesc wtextattr
  3977.     Example:
  3978.                 option=wmenuget(LCYAN|_GREEN,'A',0);
  3979.                 switch(option) {
  3980.                     case 'A':
  3981.                         ......
  3982.                     case 'D':
  3983.                         ......
  3984.                     case 0:
  3985.                         error_routine();
  3986.                     etc.
  3987.                 }
  3988.  
  3989.  
  3990.     Name:       wmessage
  3991.     Purpose:    displays text on the top or bottom border of active window
  3992.     Prototype:  int wmessage(char *str,int border,int leftofs,int attr);
  3993.     Header:     cxlwin.h
  3994.     Inputs:     str     - address of message string
  3995.                 border  - 0 = top border, 1 = bottom border
  3996.                 leftofs - offset from left border to display message at
  3997.                 attr    - attribute of message text
  3998.     Return:     W_NOERROR   - no error
  3999.                 W_NOACTIVE  - no active window
  4000.                 W_STRLONG   - string could not fit in window
  4001.                 W_NOBORDER  - window has no border
  4002.     Also see:   wtitle
  4003.     Example:
  4004.                 wmessage("Error!",0,3,LRED|_BLINK);
  4005.  
  4006.  
  4007.     Name:       wmove
  4008.     Purpose:    moves the currently active window to a new location.
  4009.     Prototype:  int wmove(int nsrow,int nscol);
  4010.     Header:     cxlwin.h
  4011.     Inputs:     nsrow   - new starting row of window
  4012.                 nscol   - new starting column of window
  4013.     Return:     W_NOERROR   - no error
  4014.                 W_ALLOCERR  - memory allocation error
  4015.                 W_NOACTIVE  - no active window
  4016.     Also see:   wcopy wsize
  4017.     Example:
  4018.  
  4019.  
  4020.                                       67   
  4021.                 if(wmove(3,10)) {
  4022.                     printf("Error:  %s\n",werrmsg());
  4023.                     exit(1);
  4024.                 }
  4025.  
  4026.  
  4027.     Name:       wopen
  4028.     Purpose:    opens a screen window and makes it active, the cursor
  4029.                 location will be initialized to window row 0, column 0, and
  4030.                 the text attribute will be initialized to the same attribute
  4031.                 as the window.
  4032.     Prototype:  WINDOW wopen(int srow,int scol,int erow,int ecol,int btype,
  4033.                           int battr,int wattr);
  4034.     Header:     cxlwin.h
  4035.     Inputs:     srow    - starting row
  4036.                 scol    - starting column
  4037.                 erow    - ending row
  4038.                 ecol    - ending column
  4039.                 btype   - border box type (0-5).  Use btype 5 for a
  4040.                           borderless window.
  4041.                 battr   - attribute of window's border.
  4042.                 wattr   - attribute of window (and initially the text)
  4043.     Return:     the window handle of the new window or a zero if an error
  4044.                 occurred. If error, the global variable _werrno will be set
  4045.                 to one of the following:
  4046.                     W_ALLOCERR  - memory allocation error
  4047.                     W_INVCOORD  - invalid coordinates
  4048.                     W_INVBTYPE  - invalid box type
  4049.     Also see:   videoinit wactiv wclose wcloseall
  4050.     Example:
  4051.                 if(!wopen(10,10,20,20,0,LCYAN|_BLUE,LCYAN|_BLUE)) {
  4052.                     printf("Error:  %s\n",werrmsg());
  4053.                     exit(1);
  4054.                 }
  4055.  
  4056.  
  4057.     Name:       wperror
  4058.     Purpose:    displays an error message window, waits for a keypress, then
  4059.                 returns to caller.
  4060.     Prototype:  int wperror(char *message);
  4061.     Header:     cxlwin.h
  4062.     Inputs:     message - address of the string containing the error message
  4063.     Return:     W_NOERROR   - no error
  4064.                 W_ALLOCERR  - memory allocation error
  4065.                 W_NOACTIVE  - no active window
  4066.                 W_STRLONG   - error message string too long
  4067.     Also see:   werrmsg
  4068.     Example:
  4069.                 wperror("Input must be numeric");
  4070.  
  4071.  
  4072.     Name:       wpgotoxy
  4073.     Purpose:    sets pseudo cursor coordinates within the currently active
  4074.                 window by wrapping around if coordinates are out of range.
  4075.     Prototype:  int wpgotoxy(int wrow,int wcol);
  4076.     Header:     cxlwin.h
  4077.     Inputs:     wrow    - window row (Y coordinate)
  4078.  
  4079.  
  4080.                                       68   
  4081.                 wcol    - window column (X coordinate)
  4082.     Return:     W_NOERROR   - no error
  4083.                 W_NOACTIVE  - no active window
  4084.                 W_INVCOORD  - invalid coordinates
  4085.     Also see:   wgotoxy wreadcur
  4086.     Example:
  4087.                 wpgotoxy(3,20);
  4088.  
  4089.  
  4090.     Name:       wprintc
  4091.     Purpose:    displays a character in the currently active window.  Does
  4092.                 not update cursor position.  Does not recognize control
  4093.                 characters.
  4094.     Prototype:  int wprintc(int row,int col,int attr,int ch);
  4095.     Header:     cxlwin.h
  4096.     Inputs:     row     - cursor row (of the window)
  4097.                 col     - cursor column (of the window)
  4098.                 attr    - character attribute
  4099.                 ch      - character
  4100.     Return:     W_NOERROR   - no error
  4101.                 W_NOACTIVE  - no active window
  4102.                 W_INVCOORD  - invalid coordinates
  4103.     Also see:   wprints wputc
  4104.     Example:
  4105.                 wprintc(5,10,LMAGENTA|BLINK,"T");
  4106.  
  4107.  
  4108.     Name:       wprintf
  4109.     Purpose:    outputs a formatted string to active window at current
  4110.                 cursor position.  Works like the standard printf() function
  4111.                 does. Recognizes control characters.  Updates cursor
  4112.                 position. Characters will be displayed in the attribute set
  4113.                 by the wtextattr() function.
  4114.     Prototype:  int wprintf(const char *format,...);
  4115.     Header:     cxlwin.h
  4116.     Inputs:     format  - format string, refer to the section on printf() in
  4117.                           the run-time library reference.
  4118.                 ...     - any additional arguments
  4119.     Return:     W_NOERROR   - no error
  4120.                 W_NOACTIVE  - no active window
  4121.     Also see:   wputc wputns wputs wtextattr
  4122.     Example:
  4123.                 wprintf("%s %c %d\n",string_arg,char_arg,int_arg);
  4124.  
  4125.  
  4126.     Name:       wprints
  4127.     Purpose:    displays a string in the currently active window.  Does not
  4128.                 update cursor position.  Does not recognize control
  4129.                 characters.
  4130.     Prototype:  int wprints(int row,int col,int attr,char *str);
  4131.     Header:     cxlwin.h
  4132.     Inputs:     row     - cursor row (of the window)
  4133.                 col     - cursor column (of the window)
  4134.                 attr    - attribute
  4135.                 str     - address of string
  4136.     Return:     W_NOERROR   - no error
  4137.                 W_NOACTIVE  - no active window
  4138.  
  4139.  
  4140.                                       69   
  4141.                 W_INVCOORD  - invalid coordinates
  4142.                 W_STRLONG   - string too long for window
  4143.     Also see:   wcenters wputs wrjusts
  4144.     Example:
  4145.                 wprints(5,10,7,"Hello, world");
  4146.  
  4147.  
  4148.     Name:       wputc
  4149.     Purpose:    displays a character in currently active window at current
  4150.                 cursor location.  Characters are displayed in the attribute
  4151.                 set by the wtextattr() function.  Recognizes control
  4152.                 characters.  Updates cursor position.
  4153.     Prototype:  int wputc(int ch);
  4154.     Header:     cxlwin.h
  4155.     Inputs:     ch  - the character to be printed
  4156.     Return:     W_NOERROR   - no error
  4157.                 W_NOACTIVE  - no active window
  4158.     Also see:   wdupc wprintc wprintf wtextattr
  4159.     Example:
  4160.                 wputc('X');
  4161.  
  4162.  
  4163.     Name:       wputns
  4164.     Purpose:    displays a string in the active window, formatting width of
  4165.                 output. Characters are displayed in the attribute set by the
  4166.                 wtextattr() function.  Recognizes control characters.
  4167.                 Updates cursor location.
  4168.     Prototype:  int wputns(char *str,int width);
  4169.     Header:     cxlwin.h
  4170.     Inputs:     str     - address of the string to print
  4171.                 width   - width to display output string with
  4172.     Return:     W_NOERROR   - no error
  4173.                 W_NOACTIVE  - no active window
  4174.     Also see:   wprintf wputs wtextattr
  4175.     Example:
  4176.                 wputns("Hello, world",5);
  4177.  
  4178.  
  4179.     Name:       wputs
  4180.     Purpose:    displays a string in currently active window at the current
  4181.                 cursor location.  Characters are displayed in the attribute
  4182.                 set by the wtextattr() function.  Recognizes control
  4183.                 characters.  Updates cursor location.
  4184.     Prototype:  int wputs(char *str);
  4185.     Header:     cxlwin.h
  4186.     Inputs:     str     - the address of the string to print
  4187.     Return:     W_NOERROR   - no error
  4188.                 W_NOACTIVE  - no active window
  4189.     Also see:   wprintf wprints wputns wtextattr
  4190.     Example:
  4191.                 wputs("\tHello, world\n\7");
  4192.  
  4193.  
  4194.     Name:       wrestore
  4195.     Purpose:    restores a previously saved window of screen memory.
  4196.     Prototype:  void wrestore(int *wbuf);
  4197.     Header:     cxlwin.h
  4198.  
  4199.  
  4200.                                       70   
  4201.     Inputs:     wbuf    - address of previously saved window
  4202.     Return:     none
  4203.     Also see:   srestore wsave wunhide
  4204.     Example:
  4205.                 wrestore(wbuf);
  4206.  
  4207.  
  4208.     Name:       wrjusts
  4209.     Purpose:    displays a string right justified to specified column in
  4210.                 active window.
  4211.     Prototype:  int wrjusts(int wrow,int wjcol,int attr,char *str);
  4212.     Inputs:     wrow    - window row
  4213.                 wjcol   - window column to right justify to
  4214.                 attr    - attribute of string text
  4215.                 str     - address of string to display
  4216.     Return:     W_NOERROR   - no error
  4217.                 W_NOACTIVE  - no active window
  4218.                 W_INVCOORD  - invalid coordinates
  4219.                 W_STRLONG   - string too long to fit in window at specified
  4220.                               right justification column.
  4221.     Also see:   wcenters wprints
  4222.     Example:
  4223.                 wrjusts(3,20,LMAGENTA,"Hello, world");
  4224.  
  4225.  
  4226.     Name:       wsave
  4227.     Purpose:    saves a window of screen memory.
  4228.     Prototype:  int *wsave(int srow,int scol,int erow,int ecol);
  4229.     Header:     cxlwin.h
  4230.     Inputs:     srow    - starting row, upper left corner
  4231.                 scol    - starting column, upper left corner
  4232.                 erow    - ending row, lower right corner
  4233.                 ecol    - ending column, lower right corner
  4234.     Return:     address of newly created window buffer or NULL if a memory
  4235.                 allocation error occurred.
  4236.     Also see:   ssave videoinit whide wintodisk wrestore
  4237.     Example:
  4238.                 int *wbuf;
  4239.                 ......
  4240.                 wbuf=wsave(7,7,18,60);
  4241.                 if(!wbuf) {
  4242.                     printf("Memory allocation error\n");
  4243.                     exit(1);
  4244.                 }
  4245.  
  4246.  
  4247.     Name:       wsbounds
  4248.     Purpose:    sets active window's scroll boundaries.
  4249.     Prototype:  int wsbounds(int wssrow,int wsscol,int wserow,int wsecol);
  4250.     Header:     cxlwin.h
  4251.     Inputs:     wssrow      - window scroll start row
  4252.                 wsscol      - window scroll start column
  4253.                 wserow      - window scroll end row
  4254.                 wsecol      - window scroll end column
  4255.     Return:     W_NOERROR   - no error
  4256.                 W_NOACTIVE  - no active window
  4257.                 W_INVCOORD  - invalid coordinates
  4258.  
  4259.  
  4260.                                       71   
  4261.     Also see:   wscroll
  4262.     Example:
  4263.                 wsbounds(10,10,20,20);
  4264.  
  4265.  
  4266.     Name:       wscanf
  4267.     Purpose:    inputs a formatted string from keyboard, works like scanf()
  4268.                 does.  This function is only supported by Turbo C.
  4269.     Prototype:  int wscanf(const char *format,...);
  4270.     Header:     cxlwin.h
  4271.     Inputs:     format  - format string, refer to the section on scanf() in
  4272.                           the run-time library reference.
  4273.                 ...     - any additional arguments
  4274.     Return:     W_NOERROR   - no error
  4275.                 W_NOACTIVE  - no active window
  4276.     Also see:   wgetc wgetns wgets winpdef winputsf wtextattr
  4277.     Example:
  4278.                 wscanf("%d %c",&int_value,&char_value);
  4279.  
  4280.  
  4281.     Name:       wscroll
  4282.     Purpose:    scrolls text within the active window, up or down.
  4283.     Prototype:  int wscroll(int count,int direc);
  4284.     Header:     cxlwin.h
  4285.     Inputs:     count       - number of lines to scroll
  4286.                 direc       - scroll direction:
  4287.                                     SUP    - scroll up
  4288.                                     SDOWN  - scroll down
  4289.     Return:     W_NOERROR   - no error
  4290.                 W_NOACTIVE  - no active window
  4291.     Also see:   wdelline winsline wsbounds
  4292.     Example:
  4293.                 wscroll(2,SDOWN);
  4294.  
  4295.  
  4296.     Name:       wsetesc
  4297.     Purpose:    sets the Escape checking for window keyboard input functions
  4298.                 that allow Escape checking.
  4299.     Prototype:  void wsetesc(int option);
  4300.     Header:     cxlwin.h
  4301.     Inputs:     option  - (0-1), 0 = turn Escape checking off, 1 = turn
  4302.                           Escape checking on
  4303.     Return:     none
  4304.     Also see:   wgetchf wgetns winpread winputsf wmenuget
  4305.     Example:
  4306.                 wsetesc(0);    /* turns Escape checking off  */
  4307.  
  4308.  
  4309.     Name:       wsize
  4310.     Purpose:    adjusts the size of the active window.
  4311.     Prototype:  int wsize(int nerow,int necol);
  4312.     Header:     cxlwin.h
  4313.     Inputs:     nerow   - new end row of sized window
  4314.                 necol   - new end column of sized window
  4315.     Return:     W_NOERROR   - no error
  4316.                 W_ALLOCERR  - memory allocation error
  4317.                 W_NOACTIVE  - no active window
  4318.  
  4319.  
  4320.                                       72   
  4321.                 W_INVCOORD  - invalid coordinates
  4322.     Also see:   wcopy wmove
  4323.     Example:
  4324.                 if(wsize(23,40)) {
  4325.                     printf("Error:  %s\n",werrmsg());
  4326.                     exit(1);
  4327.                 }
  4328.  
  4329.  
  4330.     Name:       wsseldef
  4331.     Purpose:    defines a window string selection record.  For a complete
  4332.                 example of using these string selection functions, see the
  4333.                 section "String Selection Functions" in the Tutorial.
  4334.     Prototype:  int wsseldef(char *str);
  4335.     Header:     cxlwin.h
  4336.     Inputs:     str     - string to be used for selection
  4337.     Return:     W_NOERROR   - no error
  4338.                 W_ALLOCERR  - memory allocation error
  4339.                 W_NOACTIVE  - no active window
  4340.     Also see:   wsselget
  4341.     Example:
  4342.                 if(wsseldef("LPT1")) {
  4343.                     printf("%d %s\n",_werrno,werrmsg());
  4344.                     exit(1);
  4345.                 }
  4346.  
  4347.  
  4348.     Name:       wsselget
  4349.     Purpose:    gets a string selection from the keyboard
  4350.     Prototype:  char *wsselget(int attr);
  4351.     Inputs:     attr    - attribute of the selections
  4352.     Return:     the address of the selected string or NULL if error.  If
  4353.                 error, the global variable _werrno will be set to one of
  4354.                 the following:  W_NOERROR   - no error
  4355.                                 W_NOACTIVE  - no active window
  4356.                                 W_ESCPRESS  - Escape key was pressed
  4357.                                 W_NOSELDEF  - no selection records defined
  4358.     Also see:   wsetesc wsseldef
  4359.     Example:
  4360.                 char *p;
  4361.                 p=wsselget(LRED|_GREEN);
  4362.                 if(p==NULL) {
  4363.                     printf("%d %s\n",_werrno,werrmsg());
  4364.                     exit(1);
  4365.                 }
  4366.  
  4367.  
  4368.     Name:       wtextattr
  4369.     Purpose:    sets the default text attribute for text displayed in
  4370.                 active window.
  4371.     Prototype:  int wtextattr(int attr);
  4372.     Header:     cxlwin.h
  4373.     Inputs:     attr    - the new text attribute
  4374.     Return:     W_NOERROR   - no error
  4375.                 W_NOACTIVE  - no active window
  4376.     Also see:   attrib wchgattr
  4377.     Example:
  4378.  
  4379.  
  4380.                                       73   
  4381.                 wtextattr(LMAGENTA|BLINK);
  4382.  
  4383.  
  4384.     Name:       wtitle
  4385.     Purpose:    gives active window a title and displays title on top border
  4386.                 line of window.
  4387.     Prototype:  int wtitle(char *str,int tpos,int tattr);
  4388.     Header:     cxlwin.h
  4389.     Inputs:     str     - address of title string or NULL to delete title
  4390.                 tpos    - position of title:
  4391.                             TDELETE - to delete title
  4392.                             TLEFT   - left justified
  4393.                             TCENTER - centered
  4394.                             TRIGHT  - right justified
  4395.                 tattr   - attribute of window's title
  4396.     Return:     W_NOERROR   - no error
  4397.                 W_NOACTIVE  - no active window
  4398.                 W_STRLONG   - title string too long for window
  4399.                 W_INVTPOS   - invalid title position argument
  4400.     Also see:   wmessage
  4401.     Example:
  4402.                 wtitle("[ My Window ]",TCENTER,YELLOW);
  4403.  
  4404.  
  4405.     Name:       wunhide
  4406.     Purpose:    unhides a previously hidden window.
  4407.     Prototype:  int *wunhide(int **wbuf);
  4408.     Header:     cxlwin.h
  4409.     Inputs:     wbuf    - address of the pointer to the window buffer to
  4410.                           unhide
  4411.     Return:     the address of the unhidden window's buffer or a NULL if a
  4412.                 memory allocation error occurred
  4413.     Also see:   whide wrestore
  4414.     Example:
  4415.                 if(!wunhide(wbuf)) {
  4416.                     printf("Memory allocation error\n");
  4417.                     exit(1);
  4418.                 }
  4419.  
  4420.  
  4421.     Name:       wvline
  4422.     Purpose:    draws a vertical text line in active window using characters
  4423.                 defined by given box type.  If vertical line crosses a
  4424.                 horizontal line of the same box type, an appropriate
  4425.                 intersection or corner will be used.
  4426.     Prototype:  int wvline(int wsrow,int wscol,int count,int btype);
  4427.     Header:     cxlwin.h
  4428.     Inputs:     wsrow   - window start row of line
  4429.                 wscol   - window start column of line
  4430.                 count   - number of line characters to display
  4431.                 btype   - box type (0-5)
  4432.     Return:     W_NOERROR   - no error
  4433.                 W_NOACTIVE  - no active window
  4434.                 W_INVCOORD  - entire text line could not fit in window
  4435.                 W_INVBTYPE  - invalid box type
  4436.     Also see:   whline wtextattr
  4437.     Example:
  4438.  
  4439.  
  4440.                                       74   
  4441.                 wvline(3,9,14,1);
  4442.     
  4443.  
  4444.  
  4445.  
  4446.  
  4447.  
  4448.  
  4449.  
  4450.  
  4451.  
  4452.  
  4453.  
  4454.  
  4455.  
  4456.  
  4457.  
  4458.  
  4459.  
  4460.  
  4461.  
  4462.  
  4463.  
  4464.  
  4465.  
  4466.  
  4467.  
  4468.  
  4469.  
  4470.  
  4471.  
  4472.  
  4473.  
  4474.  
  4475.  
  4476.  
  4477.  
  4478.  
  4479.  
  4480.  
  4481.  
  4482.  
  4483.  
  4484.  
  4485.  
  4486.  
  4487.  
  4488.  
  4489.  
  4490.  
  4491.  
  4492.  
  4493.  
  4494.  
  4495.  
  4496.  
  4497.  
  4498.  
  4499.  
  4500.                                       75   
  4501.